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

PHPイベントメカニズムの原理

墨辰丷
リリース: 2023-03-31 08:34:02
オリジナル
3219 人が閲覧しました

この記事では主に PHP のイベントメカニズムの原理を紹介します。興味のある方はぜひ参考にしてください。

この記事の例では、PHP がイベント メカニズムを実装する方法について説明します。具体的な分析は次のとおりです。

組み込みのイベント メカニズムを備えた言語は多くありませんが、PHP には組み込まれていません。このような機能を提供します。簡単に言うと、イベントは実装が簡単な 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 は正規表現を使用してコンテンツ内のリンクを抽出します

PHP は漢字を実装しますフォントをロードして保存するための検証コード

php

以上がPHPイベントメカニズムの原理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート