<?php
final class CanNotSetProperties extends RuntimeException
{
public function __construct()
{
parent::__construct("You can not set properties on Immutable objects.");
}
}
final class ConstructorIsVisible extends RuntimeException
{
public function __construct()
{
parent::__construct("Immutable objects can not expose the constructor.");
}
}
final class CanNotBeCloned extends RuntimeException
{
public function __construct()
{
parent::__construct("Immutable objects can not be cloned.");
}
}
trait Immutable
{
public function __set($property, $value)
{
throw new CanNotSetProperties;
}
private function __clone()
{
throw new CanNotBeCloned;
}
final private function __construct()
{
}
}
final class Test {
use Immutable;
public function __construct()
{
echo 'hello';
}
public function __clone()
{
echo 'baba';
}
}
$test = new Test;
$test2 = clone $test;