<?php
class Observable implements SplSubject
{
private $storage;
function __construct()
{
$this->storage = new SplObjectStorage();
}
function attach(SplObserver $observer)
{
$this->storage->attach($observer);
}
function detach(SplObserver $observer)
{
$this->storage->detach($observer);
}
function notify()
{
foreach ($this->storage as $obj) {
$obj->update($this);
}
}
//...
}
abstract class Observer implements SplObserver
{
private $observable;
function __construct(Observable $observable)
{
$this->observable = $observable;
$observable->attach($this);
}
function update(SplSubject $subject)
{
if ($subject === $this->observable) {
$this->doUpdate($subject);
}
}
abstract function doUpdate(Observable $observable);
}
class ConcreteObserver extends Observer
{
function doUpdate(Observable $observable)
{
//...
}
}
$observable = new Observable();
new ConcreteObserver($observable);
The SplSubject interface
(PHP 5 >= 5.1.0)
Einführung
The SplSubject interface is used alongside SplObserver to implement the Observer Design Pattern.
Interface-Übersicht
SplSubject
{
/* Methoden */
}Inhaltsverzeichnis
- SplSubject::attach — Attach an SplObserver
- SplSubject::detach — Detach an observer
- SplSubject::notify — Notify an observer
Anonymous ¶
15 days ago
przemyslaw dot szpiler at gmail dot com ¶
1 year ago
<?php
// Example implementation of Observer design pattern:
class MyObserver1 implements SplObserver {
public function update(SplSubject $subject) {
echo __CLASS__ . ' - ' . $subject->getName();
}
}
class MyObserver2 implements SplObserver {
public function update(SplSubject $subject) {
echo __CLASS__ . ' - ' . $subject->getName();
}
}
class MySubject implements SplSubject {
private $_observers;
private $_name;
public function __construct($name) {
$this->_observers = new SplObjectStorage();
$this->_name = $name;
}
public function attach(SplObserver $observer) {
$this->_observers->attach($observer);
}
public function detach(SplObserver $observer) {
$this->_observers->detach($observer);
}
public function notify() {
foreach ($this->_observers as $observer) {
$observer->update($this);
}
}
public function getName() {
return $this->_name;
}
}
$observer1 = new MyObserver1();
$observer2 = new MyObserver2();
$subject = new MySubject("test");
$subject->attach($observer1);
$subject->attach($observer2);
$subject->notify();
/*
will output:
MyObserver1 - test
MyObserver2 - test
*/
$subject->detach($observer2);
$subject->notify();
/*
will output:
MyObserver1 - test
*/
?>
