我不确定这个名字…我想做一些像WordPress一样的东西。add_action
函数在一个函数之后调用另一个函数
像这样:
add_action('the_function()','the_function_to_add()');
好了,我知道如何在1之前添加一个函数。但是可以在1后面加吗?
添加前:call_user_func('barber', func(), func2() );
在berber()函数之前添加func()和func2()。
在Wordpress中add_action创建一个特定Wordpress操作的钩子。然后在动作触发自身的某个点调用该函数。
这类似于事件分派器,其中add_action
充当分派器,它将调用给定函数的代码与函数本身解耦。当一个事件(动作)被触发时,调度程序可以调用所有注册的函数。
至于实现,它在PHP中并没有作为一组函数,但是它可以相当容易地创建。
编辑
这里有一个这样的实现:
<?php
class Dispatcher {
// Event ID to callback functions array
private $callbacks = array();
function subscribe($event_id, $callback) {
if (!isset($this->callbacks[$event_id])) {
$this->callbacks[$event_id] = array();
}
$this->callbacks[$event_id][] = $callback;
var_dump($this->callbacks);
}
function publish($event_id, $obj = NULL) {
$callbacks = $this->callbacks[$event_id];
if ($callbacks) {
foreach ($callbacks as $callback) {
call_user_func($callback, $obj);
}
}
}
}
// This object would be shared where appropriate (hopefully you can avoid a global object!)
$dispatcher = new Dispatcher();
// Your code
function receiver($obj) {
echo "Receiver got " . $obj;
}
$dispatcher->subscribe('test-event', 'receiver');
// Somewhere else, possibly in someone else's code in a different class
$dispatcher->publish('test-event', 123);
?>
输出:array(1) {
["test-event"]=>
array(1) {
[0]=>
string(8) "receiver"
}
}
Receiver got 123
第一个数组只是为了理解$callbacks
存储的内容。当"test-event"事件被发布时,所有注册的回调函数都将被执行。
如果这是Wordpress, add_action
将是你自己代码中的subscribe
, publish
将是Wordpress自己代码中调用的do_action
。
对于这个简单的例子,我允许在publish
过程中传递一个任意对象。
最后,如果你使用的是一个不错的框架,这肯定已经在它的某个地方实现了,但希望这个例子能展示它是多么容易和有用。
您可以使用override_function()
或runkit_function_redefine()
将函数替换为您自己的实现。该实现可以调用原始实现,然后调用使用add_action
添加的任何内容。这两个函数只能作为PECL扩展使用。
这也不是WordPress的方式。使用add_action()
扩展的函数从一开始就以一种使用add_action()
进行扩展的方式实现。可以使用add_action()
扩展的函数在执行过程中的某个时刻调用do_action()
。这就是观察者模式。