我想为对象的方法添加自定义事件处理程序。
我有一个方法课。
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);
有可能做这样的事吗?希望我的问题很明确。
答案 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;
}
}
简单地称之为:
ToroHook::add('404', function($errorpage){
render("page/not_found", array("errorpage" => $errorpage));
});
答案 3 :(得分:1)
查看我的sphido/events资料库:
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