ホームページ > バックエンド開発 > PHPチュートリアル > PHP遅延静的バインディング(予備的な理解)

PHP遅延静的バインディング(予備的な理解)

WBOY
リリース: 2016-06-23 13:04:13
オリジナル
795 人が閲覧しました

(私はこの高度なことに触れたばかりで、まだよくわかっていませんが、大まかに理解しました。)

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

科普几个:1.什么是静态调用?并不是说有::就是静态调用,而是看calling scope。2.$this指针指向的对象就是这个方法被调用时刻的calling scope,静态调用是没有calling scope的,非静态调用this−>abc()中的this−>abc()中的this指向的对象就是calling scope。3.大家尽量要避免使用”::”来调用一个非静态的方法.4.this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。this是指向当前对象的指针,self是指向当前类的指针,parent是指向父类的指针。5.静态环境即静态域。public static function
ログイン後にコピー

引用参考:

http://www.laruence.com/2012/06/14/2628.html

http://www.cnblogs.com/yjf512/archive/2012/09/12/2682556 .html

最初の例

Example #1 self:: 用法< ?phpclass A {    public static function who() {//这是一个静态域        echo __CLASS__;    }    public static function test() {         self::who(); //self关键字是调用自身的静态域方法,调用的是上面那个    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();  //这里因为b继承了a,理论上B::test()应该是出现B的输出,但是因为使用 self:: ,self是调用自身            //所以输出A?>以上例程会输出:A
ログイン後にコピー

2 番目の例

Example #2 static:: 简单用法< ?phpclass A {    public static function who() {        echo __CLASS__;    }    public static function test() {  //这是一个静态作用域        static::who(); // 后期静态绑定从这里开始                       // 虽然B继承A,B在调用test方法的时候,静态作用域会解析为了当前类B类,这就是“static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。”                       //所以会调用B类的who方法,所以输出B    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();  ?>以上例程会输出:B
ログイン後にコピー

非静的環境では、呼び出されるクラスはオブジェクト インスタンスが属するクラスです。 $this-> は同じスコープ内の private メソッドを呼び出そうとするため、static:: は異なる結果を返す可能性があります。もう 1 つの違いは、static:: は静的プロパティでのみ使用できることです。

3 番目の例

Example #3 非静态环境下使用 static::< ?phpclass A {    private function foo() {  //这不是一个静态域        echo "success!\n";    }    public function test() { //这不是一个静态域        $this->foo();        echo "---------\n";        var_dump($this);        static::foo();        echo "+++++++++\n";    }}class B extends A {   /* foo() will be copied to B, hence its scope will still be A and    * the call be successful */    //scope依然是A,所以能够调用private的foo}class C extends A {    private function foo() {        /* original method is replaced; the scope of the new one is C */        //因为c重写了foo方法,所以scope是c,而test是scope A,所以无法调用private的foo    }}$b = new B();$b->test();echo "--------分隔线,下面是c类相关调用\n";$c = new C();$c->test();   //fails?>以上例程会输出:success!---------object(B)#1 (0) {}success!+++++++++--------分隔线,下面是c类相关调用success!---------object(C)#2 (0) {}Fatal error: Call to private method C::foo() from context 'A'
ログイン後にコピー

証明方法はまだわかりませんが、何かはわかります。これは静的スコープではないため、スコープがあり、関数自体のスコープは次のとおりです。たとえそれが継承であっても、スコープを渡すためにparent::が使用されない限り、他のものではなくそれ自体。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート