<?php
interface Subject
{
public function registerObserver(Observer $observer);
public function removeObserver(Observer $observer);
public function notifyObserver();
}
interface Observer
{
public function update();
}
class DataCenter implements Subject
{
private $observerList;
private $state;
public function __construct()
{
$this->observerList = [];
}
public function registerObserver(Observer $observer)
{
$className = get_class($observer);
$this->observerList[$className] = $observer;
}
public function removeObserver(Observer $observer)
{
$className = get_class($observer);
if (isset($this->observerList[$className])) {
unset($this->observerList[$className]);
}
}
public function notifyObserver()
{
foreach ($this->observerList as $className => $observer) {
if (is_null($observer) || !($observer instanceof Observer)) {
continue;
}
$observer->update();
}
}
public function setState($state)
{
$this->state = $state;
$this->notifyObserver();
}
public function getState()
{
return $this->state;
}
}
class ObserverOne implements Observer
{
private $subject;
public function __construct(Subject $subject)
{
$this->subject = $subject;
$subject->registerObserver($this);
}
public function update()
{
echo "This ObserverOne: state is ".$this->subject->getState()."<br>\n";
}
}
class ObserverTwo implements Observer
{
private $subject;
public function __construct(Subject $subject)
{
$this->subject = $subject;
$subject->registerObserver($this);
}
public function update()
{
echo "This ObserverTwo: state is ".$this->subject->getState()."<br>\n";
}
}
class Test
{
public function run()
{
$dataCenter = new DataCenter();
$obOne = new ObserverOne($dataCenter);
$obTwo = new ObserverTwo($dataCenter);
$dataCenter->setState('abc');
}
}
$test = new Test();
$test->run();