php後期静的バインド

2065 ワード

php 5から.3からphpは、継承範囲内で静的呼び出しを参照するクラスに後期バインドという機能を追加します.
この機能は言語内部の観点から「後期静的バインド」と命名されている.「後期バインド」とは、static::現在のメソッドが定義されているクラスではなく、実際の実行時に計算されたものであり、「静的バインド」にもなります.静的メソッドの呼び出しに限定されないため、彼は使用することができる.
self::の制限
selfの使用::または_class_現在のメソッドが定義されているクラスに応じて、現在のクラスの静的参照
例:
class 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


  
印刷結果:A
後期静的バインドの使用法
後期静的バインドは、実行時に最初に呼び出されたクラスを表すキーワードを導入することによって制限を回避しようとします.簡単に言えば、このキーワードは、上記でtest()を呼び出すときに参照するクラスがAではなくBであることを可能にします.最終的には、新しいキーワードを参照するのではなく、予約済みstaticキーワードを使用することにします.
例:
<?php

class 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
後期静的バインディングの処理方式は、従来全く解決されていなかった静的呼び出しを解決する一方、静的呼び出しがparent::またはself::を使用すると呼び出し情報が転送される
<?php

class A {

    public static function foo() {

        static::who();

    }



    public static function who() {

        echo __CLASS__."
"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."
"; } } class C extends B { public static function who() { echo __CLASS__."
"; } } C::test(); ?>

  
印刷結果:
A C C
例:
<?php

class a {

  static public function test() {

    print get_called_class();

  }

}



class b extends a {

}



a::test(); 

b::test(); 



?> 


  
印刷結果:a
b
特別声明:
get_called_class();クラスの名前を取得する静的メソッドで呼び出されます