Пример реализации паттерна "Слушатель" (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;
}
}