Реализация паттерна "Слушатель" (observer listener)

05.01.2016

Пример реализации паттерна "Слушатель" (observer listener) на php

Есть обновленная версия с использованием интерфейса 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;
	}
  }

Скачать


Категории: PHP, Class
Яндекс.Метрика