0

我不确定这个名字……我想做一些像 WordPress 一样的东西。在add_action函数之后调用函数的函数。

像这样的东西:

add_action('the_function()','the_function_to_add()');

好吧,我想出了如何在一个函数之前添加一个函数。但是可以在一个之后添加吗?

在之前添加:call_user_func('barber', func(), func2() );在 berber() 函数之前添加 func() 和 func2()。

4

2 回答 2

1

在 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_actionsubscribe在您自己的代码中,并且publishdo_action在 Wordpress 自己的代码中调用。

对于这个简单的示例,我允许在publish.

最后,如果你正在使用一个体面的框架,这肯定已经在其中的某个地方实现了,但希望这个示例显示它是多么简单和有用。

于 2013-05-19T23:48:28.077 回答
0

您可以使用override_function()runkit_function_redefine()用您自己的实现替换该功能。该实现可以调用原始实现,然后调用使用add_action. 这两个函数都只能作为 PECL 扩展使用。

这也不是 WordPress 的做法。您扩展 using 的add_action()功能从一开始就以可扩展 using 的方式实现add_action()。可以在执行期间的某个时间点使用add_action()call扩展的函数。do_action()这简直就是观察者模式

于 2013-05-19T23:55:10.643 回答