2013-05-19 105 views
0

林不知道這個名字...我想要做一些像WordPress一樣。在函數後調用函數的函數add_action如何在已經調用的函數之後創建添加或調用其他函數的函數。 PHP

事情是這樣的:

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

好吧,我想通了,怎麼一個前添加一個功能。但是可以在一個之後添加嗎?

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

+0

你基本上想調用一個任意的函數名嗎? –

+0

您的call_user_func正在有效地調用理髮師(func(),func2())。正如衛斯理所說,你可能不需要這個。如果你能夠完全展開你想要完成的事情,你會得到更好的答案。 –

+0

我想要的是能夠在特定函數之前和之後調用函數,同時將代碼添加到其他函數 –

回答

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商店什麼。每當「測試事件」事件發佈時,所有註冊的回調函數都將被執行。

如果這是WordPress的,add_action會在自己的代碼中subscribepublishdo_action被稱爲在WordPress的自己的代碼。

對於這個簡單的例子,我允許在publish期間傳遞任意對象。

最後,如果你正在使用一個體面的框架,這肯定已經在其中的某個地方實現過了,但是希望這個例子展示它可能是多麼簡單和有用。

+0

哦,我明白了。如何創建它?你能幫我嗎? –

+1

謝謝。而且我還沒有使用FrameWork。建立我自己的:)再次感謝 –

+0

有沒有辦法確定如果我想要它之前或之後已經存在的功能? –

0

您可以使用override_function()runkit_function_redefine()將函數替換爲您自己的實現。該實現可以調用原始實現,然後調用使用add_action添加的任何內容。這兩個功能都只能作爲PECL擴展使用。

這也不是WordPress做它的方式。您使用add_action()進行擴展的功能從一開始就以一種可以使用add_action()進行擴展的方式實現。可以使用add_action()在執行期間的某個時間調用do_action()的函數。這只是observer pattern

+0

我是否需要創建override_function或runkit_function_redefine()函數?由於它返回未定義的函數。 –

+0

您必須安裝提供該功能的PECL擴展。 – Oswald

相關問題