ホームページ > バックエンド開発 > PHPチュートリアル > イベントメカニズムのPHP実装例の分析

イベントメカニズムのPHP実装例の分析

WBOY
リリース: 2016-06-13 12:22:29
オリジナル
809 人が閲覧しました

イベントメカニズムのPHP実装の分析例

イベントメカニズムのPHP実装の分析例


イベントメカニズムを組み込んだ言語は多くありませんが、PHPはそのような機能を提供しません。簡単に言うと、イベントは実装が簡単な Observer パターンです。ただし、違いは、イベント リスナーは誰でも追加できますが、イベント リスナーを直接含むオブジェクトによってのみトリガーできることです。これは少し難しいです。 PHP には debug_backtrace 関数があり、現在の呼び出しスタックを取得できます。これにより、イベントをトリガーする関数を呼び出すオブジェクトにそのオブジェクトが直接含まれているかどうかを判断できます。

<?php/*** 事件* @edit http://www.lai18.com * @author xiezhenye <[email&#160;protected]>*/class Event {  private $callbacks = array();  private $holder;  function __construct() {    $bt = debug_backtrace();    if (count($bt) < 2) {      $this->holder = null;      return;    }    $this->holder = &$bt[1]['object'];  }  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]['object'] !== $this->holder)        || (count($bt) < 2))) {      throw(new Exception('Notify can only be called in holder'));    }    foreach ($this->callbacks as $callback) {      $args = func_get_args();      call_user_func_array($callback, $args);    }  }}
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート