<?php
interface Observer
{
public function update($state);
}
interface Observable
{
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
class MyObserver implements Observer
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function update($state)
{
echo $this->name . ' received state: ' . $state . "\n";
}
}
class MySubject implements Observable
{
private $observers = [];
private $state;
public function attach(Observer $observer)
{
array_push($this->observers, $observer);
}
public function detach(Observer $observer)
{
if (($index = array_search($observer, $this->observers, true)) !== false) {
unset($this->observers[$index]);
}
}
public function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this->state);
}
}
public function setState($state)
{
$this->state = $state;
$this->notify();
}
}
$subject = new MySubject();
$observerA = new MyObserver('Observer A');
$observerB = new MyObserver('Observer B');
$subject->attach($observerA);
$subject->attach($observerB);
$subject->setState('Ready');