yii 2の動作を明らかにする方法はどのようにコンポーネントクラスに注入されたのか~

2001 ワード

挙動属性の注入論理を理解すると,方法の注入は我々にとって簡単である.論理は同じだ.
ただ今は呼び出さないgetメソッドではなく、メソッド用の_callメソッド.
研究する前にPHPを2つ勉強したのは
  • __call
  • call_user_func_array

  • __call
    __callはPHPのマジックメソッドで、このメソッドと_getの機能はあまり悪くありません.クラスのメソッドが定義されていないことを発見すると、この関数がトリガーされます.この関数には2つのパラメータがあります.
    public mixed __call ( string $name , array $arguments )

    $nameパラメータは、呼び出すメソッド名です.$Argumentsパラメータは、メソッド$nameに渡すパラメータを含む列挙配列であり、例を挙げる
    class User {
        public function __call($name, $arguments) {
                echo "Calling object method '$name' "
                     . implode(', ', $arguments). "
    "; } } // do it $model = new User(); $model->hello("abei2017");// Calling object method 'hello' abei2017

    わかりましたか、公式ドキュメントのアドレスを貼ってドアを転送します
    call_user_func_array
    コールバック関数を呼び出し、配列パラメータをコールバック関数のパラメータとします.まず公式ドキュメントのアドレス転送ドアを貼って、例を挙げてから.
    class User {
        function Hello($arg) {
            echo __METHOD__, " got $arg
    "; } } $model = new User(); call_user_func_array([$model, "Hello"], ["abei2017"]); // User::Hello got abei2017

    OK,この2つの関数を理解した後,挙動法の注入を研究し始めた.
    メソッドの注入方法
    簡単に言えば、一つの方法です.
    // vendor/yiisoft/yii2/base/Component.php
    public function __call($name, $params){
    
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $object) {
            if ($object->hasMethod($name)) {
                return call_user_func_array([$object, $name], $params);
            }
        }
        throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
    }

    論理は簡単だ
  • $this->ensureBehaviors()を使用します.関数を使用して、すべての動作を確認します.
  • コンポーネントの現在の動作を巡回し、動作オブジェクトのこのメソッドが存在するかどうかを判断します.
  • 存在する場合call_を通過するuser_func_Arrayがこの動作を呼び出す方法
  • 最後に、コンポーネントが自分のメソッドを呼び出すのと同じ効果を達成します.
    小結
    今まで私たちはどのように行為、行為の運行、行為の注入原理を配置するかを知っていて、次の編は私たちが1つの総括を行って、落ちた例えば行為の操作を解除して話します.