如何创建一个函数,在已调用的函数之后添加或调用另一个函数.PHP



我不确定这个名字…我想做一些像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()。这就是观察者模式。

最新更新