在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
商店什麼。每當「測試事件」事件發佈時,所有註冊的回調函數都將被執行。
如果這是WordPress的,add_action
會在自己的代碼中subscribe
和publish
將do_action
被稱爲在WordPress的自己的代碼。
對於這個簡單的例子,我允許在publish
期間傳遞任意對象。
最後,如果你正在使用一個體面的框架,這肯定已經在其中的某個地方實現過了,但是希望這個例子展示它可能是多麼簡單和有用。
你基本上想調用一個任意的函數名嗎? –
您的call_user_func正在有效地調用理髮師(func(),func2())。正如衛斯理所說,你可能不需要這個。如果你能夠完全展開你想要完成的事情,你會得到更好的答案。 –
我想要的是能夠在特定函數之前和之後調用函數,同時將代碼添加到其他函數 –