mirror of
https://github.com/php/php-src.git
synced 2025-01-10 21:14:37 +08:00
117 lines
2.2 KiB
PHP
Executable File
117 lines
2.2 KiB
PHP
Executable File
--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===
|