mirror of
https://github.com/php/php-src.git
synced 2024-10-17 14:32:37 +00:00
117 lines
2.2 KiB
Plaintext
117 lines
2.2 KiB
Plaintext
|
--TEST--
|
||
|
SPL: Observer and Subject (empty notify)
|
||
|
--FILE--
|
||
|
<?php
|
||
|
|
||
|
class ObserverImpl implements Observer
|
||
|
{
|
||
|
protected $name = '';
|
||
|
|
||
|
function __construct($name = 'obj')
|
||
|
{
|
||
|
$this->name = '$' . $name;
|
||
|
}
|
||
|
|
||
|
function update(Subject $subject)
|
||
|
{
|
||
|
echo $this->name . '->' . __METHOD__ . '(' . $subject->getName() . ");\n";
|
||
|
}
|
||
|
|
||
|
function getName()
|
||
|
{
|
||
|
return $this->name;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class SubjectImpl implements Subject
|
||
|
{
|
||
|
protected $name = '';
|
||
|
protected $observers = array();
|
||
|
|
||
|
function __construct($name = 'sub')
|
||
|
{
|
||
|
$this->name = '$' . $name;
|
||
|
}
|
||
|
|
||
|
function attach(Observer $observer)
|
||
|
{
|
||
|
echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n";
|
||
|
if (!in_array($observer, $this->observers))
|
||
|
{
|
||
|
$this->observers[] = $observer;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function detach(Observer $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===
|