PHPの遅延バインディング

不言
不言オリジナル
2018-04-04 14:19:011379ブラウズ

この記事の内容は、PHP 遅延バインディングです。必要な友達はこの記事も参照してください


PHP 5.3.0 以降、PHP には という機能が追加されています。遅延静的バインディング。継承スコープ内で静的に呼び出されるクラスを参照するために使用されます。

正確に言うと、遅延静的バインディングの動作原理は、前の「非転送呼び出し」(非転送

) にデータを保存することです。 call) クラス名。静的メソッド呼び出しを行うとき、クラス名は明示的に指定されたものです (通常は ::
演算子); 非静的メソッド呼び出しを行う場合、それはオブジェクトが属するクラスです。いわゆる「転送電話」(転送

) call) は、次のメソッドによる静的呼び出しを指します: self::、parent::、static::、および

forward_static_call()。 get_called_class() 関数を使用して、呼び出されたメソッドのクラス名 static:: を取得できます

とその範囲を指摘している。

この機能は、言語内部の観点から「遅延静的バインディング」と呼ばれています。 「遅延バインディング」とは、静的::
を意味します。 現在のメソッドが定義されているクラスに解析されることはなくなりますが、実際の実行時に計算されます。静的メソッドの呼び出し (ただし、それに限定されない) に使用できるため、「静的バインディング」とも呼ばれます。


self


現在のメソッドが定義されているクラスに応じて、self:: または
CLASS

を現在のクラスへの静的参照として使用します。

例 #1 self::Usage

<?phpclass A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        self::who();
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); //输出A?>

static後期静的バインディング

後期静的バインディングの使用は、実行時に最初に呼び出されるクラスを表す新しいキーワードを導入することで制限を回避することを目的としていました。簡単に言うと、このキーワードを使用すると、上記の例で test() を呼び出すときに、クラス A の代わりにクラス B を参照できるようになります。最終的には、新しいキーワードを導入せず、すでに予約されている静的キーワードを使用することが決定されました。

<?phpclass A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();  //输出B?>

注:

非静的環境では、呼び出されるクラスはオブジェクト インスタンスが属するクラスです。 $this-> は同じスコープ内でプライベートメソッドを呼び出そうとするため、 static::

異なる結果が生じる可能性があります。もう 1 つの違いは、static:: は静的プロパティでのみ使用できることです。

非静的環境では static::

rreee

を使用すると、次のように出力されます:

success! 致命的なエラー: /tmp/test.php の 9 行目でコンテキスト 'A' からプライベート メソッド C::foo() を呼び出します
注:

遅延静的バインディングの解決は、完全に解決された静的呼び出しが取得されるまで続行されます。一方、parent:: または self:: を使用して静的に呼び出された場合は、呼び出し情報が転送されます。

呼び出しの転送と非転送

<?phpclass A {
    private function foo() {
        echo "success!\n";
    }    public function test() {
        $this->foo();        static::foo();
    }
}class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */}class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}$b = new B();$b->test();$c = new C();$c->test();   //fails?>


上記のルーチンは出力します:

A C C

関連推奨事項:

PHP の遅延バインディング

PHP の遅延バインディングの問題について考える

以上がPHPの遅延バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。