Допустим есть курс, на нем есть один лектор/профессор (observer) и множество слушателей / студентов (listener)
Реализация паттерна "Слушатель" (observer listener) с использованием интерфейса SplObserver
20.03.2018
Observable.php (Download)
<?php error_reporting(E_ALL); ini_set('display_errors', 'On'); // Основные классы /** * Абстрактный класс "Наблюдаемый" */ abstract class Observable implements SplSubject { /** * * @var array Наблюдатели * */ protected $_aObservers = []; /** * Добавление наблюдателя * * @param object SplObserver $oObserver * * @return object $this */ public function attach(SplObserver $oObserver) { $id = spl_object_hash($oObserver); $this->_aObserver[$id] = $oObserver; return $this; } /** * Исключить наблюдателя * * @param object SplObserver $oObserver * * @return object $this */ public function detach(SplObserver $oObserver) { $id = spl_object_hash($oObserver); if (isset($this->_aObserver[$id])) { unset($this->_aObserver[$id]); } return $this; } /** * Оповестить всех наблюдателей * * @return object $this */ public function notify() { foreach ($this->_aObserver as $oObserver) { $oObserver->update($this); } return $this; } } /** * Абстрактный класс "Наблюдатель" */ abstract class Observer implements SplObserver { } ////////////////////////////////////////////////////////////// // Классы примеров /** * Профессор */ class Professor extends Observable { private $_sString = ''; public function say($sString) { $this->_sString = $sString; $this->notify(); } public function getString() { return $this->_sString; } } /** * Студент */ class Student extends Observer { private $_sName = ''; public function setName($sName) { $this->_sName = $sName; } public function update(SplSubject $oProfessor) { echo '<b>'.$this->_sName.'</b> услышал: "'.$oProfessor->getString().'"<br />'; } } $oProfessor = new Professor(); $oStudent1 = new Student(); $oStudent1->setName('Alex'); $oProfessor->attach($oStudent1); $oStudent2 = new Student(); $oStudent2->setName('Ivan'); $oProfessor->attach($oStudent2); $oStudent3 = new Student(); $oStudent3->setName('Sky'); $oProfessor->attach($oStudent3); $oProfessor->say('Тема лекции: ...');