0

これの名前についてはよくわかりません... WordPress のようなものを作りたいと思います。関数のadd_action後に関数を呼び出す関数。

このようなもの:

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

よし、関数の前に関数を追加する方法を見つけました。しかし、1つ後に追加することは可能ですか?

前に追加するには: call_user_func('barber', func(), func2() );func() と func2() を berber() 関数の前に追加します。

4

2 に答える 2

1

Wordpressでは、 add_actionは特定の Wordpress アクションへのフックを作成します。次に、アクション自体がトリガーされるポイントで関数が呼び出されます。

add_actionこれは、指定された関数を呼び出すコードを関数自体から分離するディスパッチャとして機能するイベント ディスパッチャに似ています。イベント (アクション) がトリガーされると、ディスパッチャーは登録されているすべての関数を呼び出すことができます。

実装に関しては、一連の関数として PHP にネイティブに含まれているわけではありませんが、かなり簡単に作成できます。

編集

そのような実装の 1 つを次に示します。

<?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_actionWordpress の自分のコードで呼び出されます。

この単純な例では、publish.

最後に、適切なフレームワークを使用している場合、これは既に実装されているはずですが、この例がいかに簡単で便利であるかを示していることを願っています。

于 2013-05-19T23:48:28.077 に答える
0

override_function()またはを使用runkit_function_redefine()して、関数を独自の実装に置き換えることができます。その実装は、元の実装を呼び出してから、 を使用して追加されたものを呼び出すことができますadd_action。どちらの機能も、PECL 拡張としてのみ使用できます。

これは、WordPress が行う方法でもありません。を使用して拡張する関数add_action()は、最初から を使用して拡張できるように実装されていadd_action()ます。実行中のある時点でadd_action()callを使用して拡張できる関数。do_action()これは単なるオブザーバー パターンです。

于 2013-05-19T23:55:10.643 に答える