PHP:如何实现事件处理程序?

时间:2010-10-09 16:13:08

标签: php events event-handling

我想为对象的方法添加自定义事件处理程序。

我有一个方法课。

class Post {

    public function Add($title) {

        // beforeAdd event should be called here

        echo 'Post "' . $title . '" added.';
        return;
    }
}

我想向方法Add添加一个事件,并将方法的参数传递给事件处理程序。

function AddEventHandler($event, $handler){
    // What should this function do?
}

$handler = function($title){
    return strtoupper($title);
}

AddEventHandler('beforeAdd', $handler);

有可能做这样的事吗?希望我的问题很明确。

4 个答案:

答案 0 :(得分:3)

使用此处定义的函数http://www.php.net/manual/en/book.funchand.php

应该非常简单

特别是你应该保留一个处理程序数组(如果你想为同一个事件使用多个处理程序,则保留数组数组),然后执行类似

的操作
function AddEventHandler($event, $handler){
    $handlerArray[$event] = $handler;
}

function AddEventHandler($event, $handler){
    $handlerArray[$event][] = $handler;
}

多个处理程序。

调用处理程序然后只需调用“call_user_func”(如果需要多个处理程序,最终会在一个循环中)

答案 1 :(得分:1)

好吧,如果你正在使用< php 5.3然后你不能以这种方式创建一个闭包,但你可以接近create_function();这将是

$handler = create_function('$title', 'return strtoupper($title);');

然后将$ handler存储在类中,您可以根据需要调用它。

答案 2 :(得分:1)

方法

ircmaxell here描述了多种方法。

这里是ToroPHP(路由库)中使用的ToroHook。

挂钩

class ToroHook {
    private static $instance;
    private $hooks = array();

    private function __construct() {}
    private function __clone() {}

    public static function add($hook_name, $fn){
        $instance = self::get_instance();
        $instance->hooks[$hook_name][] = $fn;
    }

    public static function fire($hook_name, $params = null){
        $instance = self::get_instance();
        if (isset($instance->hooks[$hook_name])) {
            foreach ($instance->hooks[$hook_name] as $fn) {
                call_user_func_array($fn, array(&$params));
            }
        }
    }
    public static function remove($hook_name){
        $instance = self::get_instance();
        unset($instance->hooks[$hook_name]);
        var_dump($instance->hooks);
    }
    public static function get_instance(){
        if (empty(self::$instance)) {
            self::$instance = new Hook();
        }
        return self::$instance;
    }
}

使用hook

简单地称之为:

ToroHook::add('404', function($errorpage){
    render("page/not_found", array("errorpage" => $errorpage));
});

答案 3 :(得分:1)

查看我的sphido/events资料库:

  • 它易于使用(几行代码)
  • 基于PHP Function handling
  • 允许优先考虑听众
  • 添加/删除侦听器
  • 按功能过滤值
  • 在功能链中停止传播
  • 添加默认处理程序

事件处理程序示例

on('event', function () {
  echo "wow it's works yeah!";
});

fire('event'); // print wow it's works yeah!

过滤功能示例

add_filter('price', function($price) {
  return (int)$price . ' USD';
});

echo filter('price', 100); // print 100 USD