3

このリンクで YIi ガイドを読むとき: http://www.yiiframework.com/wiki/327/events-explained/、私はこの行を見ました:

...したがって、イベントを発生させる前に、おそらくコンポーネントの初期化メソッド内で次のように呼び出す必要がありました。

$myComponent->onForestRan = array(new SomeOtherClass, 'eventHandler1');

このコードはハンドラーをイベントにアタッチすることを理解しています。左側の配列は PHP コールバック関数です。しかし、私が本当に理解していないのはその構文です.onforestRan()関数($ componentで以前に定義されています->上記のYiiリンクを参照)を呼び出しますか?イベント引数。または、それがコールバックである場合、このようなコールバックを使用する方法を見たことがありません (call_user_func() または usort() であるコールバックである場合)。その構文は私にとって本当に奇妙です。誰かがこれで私を助けることができますか? ありがとうございます!

4

2 に答える 2

2

それ自体はコールバックではありませんが、イベントに対してどのアクション (つまり、どの関数) を実行するかを Yii に伝えています。

与えられた例では、onForestRan発生すると、eventHandler1関数 fromSomeOtherClassがトリガーされます。

そのページがコールバックについて説明しているとき、代入するものは何でも$myComponent->onForestRanコールバック関数である必要があると言っています。その時点ではコールバックは実行されません。イベントが発生したときに使用するコールバックを Yii に知らせるだけです。

詳細:

ここに記載されているように、onForestRan は $myComponent の特別なプロパティです。詳細はCComponentで確認できます。CComponent のソースで113行目と同様の行を検索できます。ここで、特別なプロパティのロジックの開始を確認できます。action*これは、コントローラーのメソッドと非常によく似ています。

于 2012-08-23T16:57:10.823 に答える
1

$ CComponent-> onWhateverは、Yiiの特別な言語構造です。CComponentの魔法の__set-methodで認識され、イベントの添付ファイルとして処理される「プロパティ」onWhatever。

http://phpmaster.com/yii-under-the-hood-2/から恥知らずに引用させてください:

public function __set($name, $value){
    if (strncasecmp($name, "on", 2) === 0 && method_exists($this, $name)) {
        $name = strtolower($name);
        if (!isset($this->_e[$name])) {
            $this->_e[$name] = new CList();
        }
        return $this->_e[$name]->add($value);
    }
}

実装は最初に、$ nameの値がテキスト「on」で始まるかどうか、および値と同じ名前のメソッドも存在するかどうかを確認します。その場合、Yiiは、$valueが$nameで定義されたイベントにアタッチする必要があるコールバックの表現であると想定します。Yiiには、イベント名でキー設定されたコールバックの配列を保持するプライベートメンバー変数$ _eがあり、特定のイベントキーのリストにコールバックを追加するだけです。

$_e => array(
    'onUserRegistered' => array(
        0 => array(object, 'sendMyEmail')
    ),
    'onSomeOtherEvent'=>array(
        0 => function(){}
        1 => ...
    )
)
于 2012-08-24T08:43:48.377 に答える