首頁  >  文章  >  後端開發  >  PHP事件機制的實現

PHP事件機制的實現

*文
*文原創
2017-12-26 16:39:191798瀏覽

PHP如何實作事件機制?本文主要介紹了PHP實作事件機制的方法,實例分析了事件機制的原理與php的相關實作。希望對大家有幫助。

具體分析如下:

內建了事件機制的語言不多,php也沒有提供這樣的功能。事件(Event)說簡單了就是一個Observer模式,實作起來很容易。但有所不同的是,事件的監聽者誰都可以加,但是只能由直接包含它的物件觸發。這就有一點點難度了。 php有一個debug_backtrace函數,可以得到目前的呼叫棧,由此可以找到判斷呼叫事件觸發函數的物件是不是直接包含它的物件的辦法。


<?php
/**
* 事件
*
* @author xiezhenye <xiezhenye@gmail.com>
*/
class Event {
  private $callbacks = array();
  private $holder;
  function __construct() {
    $bt = debug_backtrace();
    if (count($bt) < 2) {
      $this->holder = null;
      return;
    }
    $this->holder = &$bt[1][&#39;object&#39;];
  }
  function attach() {
    $args = func_get_args();
    switch (count($args)) {
      case 1:
        if (is_callable($args[0])) {
          $this->callbacks[]= $args[0];
          return;
        }
        break;
      case 2:
        if (is_object($args[0]) && is_string($args[1])) {
          $this->callbacks[]= array(&$args[0], $args[1]);
        }
        return;
      default:
        return;
    }
  }
  function notify() {
    $bt = debug_backtrace();
    if ($this->holder && 
        ((count($bt) >= 2 && $bt[count($bt) - 1][&#39;object&#39;] !== $this->holder)
        || (count($bt) < 2))) {
      throw(new Exception(&#39;Notify can only be called in holder&#39;));
    }
    foreach ($this->callbacks as $callback) {
      $args = func_get_args();
      call_user_func_array($callback, $args);
    }
  }
}

相關推薦:

#實例分析PHP實作模擬http請求的方法

詳解php實作socket推送技術

#PHPCrawl爬蟲庫實作抓取酷狗歌單

以上是PHP事件機制的實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn