ホームページ  >  記事  >  バックエンド開発  >  遅延静的バインディングについて、それを解決する方法

遅延静的バインディングについて、それを解決する方法

WBOY
WBOYオリジナル
2016-06-13 13:36:06776ブラウズ

後期静的バインディングについて
後期静的バインディングについて PHP のマニュアルを読みましたが、元のアドレスは http://cn2.php.net/manual/zh/ language.oop5.late です。 -static-bindings.php

4 番目の例

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
?>


結果は次のようになります:
A
C
C
呼び出されたとき 親::foo() と self::foo() のときにクラス C の who() が呼び出されるのはなぜですか?
どなたか説明していただけますか、ありがとうございます。

-----解決策--------------------------------
静的演算子の説明:
遅延静的バインディングは、ランタイムによって最初に呼び出されたクラスを表すキーワードを導入することで制限を回避しようとします。
最初に呼び出されるクラスは C

A::foo(); 呼び出されるメソッドはクラス A です、これは理解されています
self::foo(); // この self は実はCクラス。わかりますか? C::test() C は B の test() メソッド
parent::foo(); // self::who() の代わりに static::who(); を継承します。このメソッドによって呼び出される現在のクラスは、クラス C の foo() メソッドです

おそらく、C の who() メソッドがクラス A で呼び出されない理由をまだ理解していないかもしれません。これは特別な理由によるものです。親子関係の性質。遅延静的バインディングは、特にサブクラスと親クラスの間で継承されたメソッドの問題を解決するために登場しました。
------解決策---------
マニュアルは非常に分かりやすいですね?
-------------------------------------------------- ----
「遅延バインディング」とは、static:: が現在のメソッドが定義されているクラスに解析されず、実際の実行時に計算されることを意味します。静的メソッドの呼び出し (ただし、それに限定されない) に使用できるため、「静的バインディング」とも呼ばれます。
----------------------------------------------- --- --------

#1 は小さな問題があると言いました

PHP コード
self::foo(); // この self は実際には C クラスです。わかりますか? C::test() C は B の test() メソッドを継承します <div class="clear"></div>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。