PHP实现事件机制实例分析

Posted brucemengbm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP实现事件机制实例分析相关的知识,希望对你有一定的参考价值。

php实现事件机制实例分析


内置了事件机制的语言不多,php也没有提供这种功能。事件(Event)说简单了就是一个Observer模式。实现起来非常easy。可是有所不同的是,事件的监听者谁都能够加,可是仅仅能由直接包括它的对象触发。

这就有一点点难度了。php有一个debug_backtrace函数,能够得到当前的调用栈,由此能够找到推断调用事件触发函数的对象是不是直接包括它的对象的办法。

<?php
/**
* 事件
* @edit http://www.lai18.com 
* @author xiezhenye <[email 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实现事件机制实例分析的主要内容,如果未能解决你的问题,请参考以下文章

在 header.php 文件的 php 命令中添加 Google Ads 事件片段

PHP类的自动加载机制实现方法分析

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

PHP的Trait机制

片段实例中带有 Otto 事件总线的 IllegalArgumentException

PHP必用代码片段