php-src/ext/spl/tests/observer_001.phpt
2012-10-10 10:27:49 +08:00

117 lines
2.2 KiB
PHP

--TEST--
SPL: SplObserver and SplSubject (empty notify)
--FILE--
<?php
class ObserverImpl implements SplObserver
{
protected $name = '';
function __construct($name = 'obj')
{
$this->name = '$' . $name;
}
function update(SplSubject $subject)
{
echo $this->name . '->' . __METHOD__ . '(' . $subject->getName() . ");\n";
}
function getName()
{
return $this->name;
}
}
class SubjectImpl implements SplSubject
{
protected $name = '';
protected $observers = array();
function __construct($name = 'sub')
{
$this->name = '$' . $name;
}
function attach(SplObserver $observer)
{
echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n";
if (!in_array($observer, $this->observers))
{
$this->observers[] = $observer;
}
}
function detach(SplObserver $observer)
{
echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n";
$idx = array_search($observer, $this->observers);
if ($idx !== false)
{
unset($this->observers[$idx]);
}
}
function notify()
{
echo '$sub->' . __METHOD__ . "();\n";
foreach($this->observers as $observer)
{
$observer->update($this);
}
}
function getName()
{
return $this->name;
}
}
$sub = new SubjectImpl;
$ob1 = new ObserverImpl("ob1");
$ob2 = new ObserverImpl("ob2");
$ob3 = new ObserverImpl("ob3");
$sub->attach($ob1);
$sub->attach($ob1);
$sub->attach($ob2);
$sub->attach($ob3);
$sub->notify();
$sub->detach($ob3);
$sub->notify();
$sub->detach($ob2);
$sub->detach($ob1);
$sub->notify();
$sub->attach($ob3);
$sub->notify();
?>
===DONE===
--EXPECT--
$sub->SubjectImpl::attach($ob1);
$sub->SubjectImpl::attach($ob1);
$sub->SubjectImpl::attach($ob2);
$sub->SubjectImpl::attach($ob3);
$sub->SubjectImpl::notify();
$ob1->ObserverImpl::update($sub);
$ob2->ObserverImpl::update($sub);
$ob3->ObserverImpl::update($sub);
$sub->SubjectImpl::detach($ob3);
$sub->SubjectImpl::notify();
$ob1->ObserverImpl::update($sub);
$ob2->ObserverImpl::update($sub);
$sub->SubjectImpl::detach($ob2);
$sub->SubjectImpl::detach($ob1);
$sub->SubjectImpl::notify();
$sub->SubjectImpl::attach($ob3);
$sub->SubjectImpl::notify();
$ob3->ObserverImpl::update($sub);
===DONE===