- str_repeat: documentation ( source)
<?php
class ImmutableObject
{
private $property;
public function __construct($property)
{
$this->property = $property;
}
public function withProperty($property)
{
$clone = clone($this);
$clone->property = $property;
return $clone;
}
public function getProperty()
{
return $this->property;
}
}
class BrokenImmutableObject
{
private $property;
public function __construct($property)
{
$this->property = $property;
}
public function withProperty($property)
{
if ($property == $this->property) {
return $this;
}
$clone = clone($this);
$clone->property = $property;
return $clone;
}
public function getProperty()
{
return $this->property;
}
}
function it($m,$p){echo ($p?'✔︎':'✘')." It $m\n"; if(!$p){$GLOBALS['f']=1;}}function done(){if(@$GLOBALS['f'])die(1);}
foreach (array('ImmutableObject', 'BrokenImmutableObject') as $class) {
print "\n".$class."\n".str_repeat('=', strlen($class))."\n\n";
// Expectation, $start will always have value 'start'
$start = new $class('start');
// Expectation, $next is an immutable copy of $start with value 'start'
$next = $start->withProperty('start');
// Expectation, $end is an immutable copy of $start with value 'end'
$end = $start->withProperty('end');
it('has the value "start" (has value "'.$start->getProperty().'")', 'start' === $start->getProperty());
it('has the value "start" (has value "'.$next->getProperty().'")', 'start' === $next->getProperty());
it('has the value "end" (has value "'.$end->getProperty().'")', 'end' === $end->getProperty());
print "\n";
}