Пример реализации паттерна "Слушатель" (observer listener) на php
Реализация паттерна "Слушатель" (observer listener)
05.01.2016
Есть обновленная версия с использованием интерфейса SplObserver
demo.php (Download)
<!DOCTYPE HTML> <html lang="ru"> <head> <meta charset="UTF-8"> <title>observer</title> </head> <body> <?php if ($_SERVER['REMOTE_ADDR'] == '83.166.96.95') { error_reporting(E_ALL); ini_set('display_errors', 'On'); } require_once('class.events.php'); /** * Отдельная функция * * @param arrat $aOptions - массив параметров * * * @return NULL */ function onSave($aOptions) { echo 'function "onSave" <br />'; echo '<pre>'; print_r($aOptions); echo '</pre><hr />'; } class cTest { /** * Статичный метод * * @param arrat $aOptions - массив параметров * * @return NULL */ static function onSaveStatic($aOptions) { echo 'static method "onSaveStatic" <br />'; echo '<pre>'; print_r($aOptions); echo '</pre><hr />'; } /** * Публичный метод * * @param arrat $aOptions - массив параметров * * @return NULL */ public function onSaveMethod($aOptions) { echo 'static method "onSaveStatic" <br />'; echo '<pre>'; print_r($aOptions); echo '</pre><hr />'; } } //------------------------------------------- // Main: // Тестовый массив с параметрами: $aOptions = array ('id' => 10, 'name' => 'OK'); // Объект тестового класса $oTest = new cTest(); // $oEvents = new soEvents(); // Отдельная функция $oEvents->on('save', 'onSave', $aOptions); // Статичный метод $oEvents->on('save', array('cTest', 'onSaveStatic'), $aOptions); // Вызов метода $oEvents->on('save', array($oTest, 'onSaveMethod'), $aOptions); // Ошыбочный вызов 1 $oEvents->on('save', 'noExistsFunction', $aOptions); // Ошыбочный вызов 2 $oEvents->on('save', array('cTest', 'noExists'), $aOptions); // Ошыбочный вызов 3 $oEvents->on('save', array($oTest, 'noExists'), $aOptions); $oEvents->trigger('save'); ?> </body> </html> <?
class.observer.php (Download)
<?php /** * Базовый класса observer */ class soObserver { /** * * @param array $_aEvents - хранит все события и связанные с ними callback'и */ protected $_aEvents = array(); /** * Метод позволяющий добавлять "слушателей" * * @param string $sEvent - имя события * @param mixed $observer - функция или метод объекта который нужно вызвать при сробатывании мобытия * @param array $aOptions - массив параметров которые нужно передать в метод * * * @return object возвращает $this для обеспечения цепочки вызовов */ public function on($sEvent, $observer, $aOptions = array()) { $this->_aEvents[$sEvent][] = array($observer, $aOptions); return $this; } /** * Метод активации события * * @param string $sEvent - имя события * * @return object возвращает $this для обеспечения цепочки вызовов */ public function trigger($sEvent) { // is_callable foreach($this->_aEvents[$sEvent] as $aEvent) { $observer = $aEvent[0]; $aOptions = $aEvent[1]; if (is_callable($observer)) { call_user_func($observer, $aOptions); } else { echo 'Error call "<pre>'; print_r($observer); echo '</pre>"<br />'; } } return $this; } }