php 後期延遲靜態繫結(初步瞭解)

來源:互聯網
上載者:User
(剛接觸這個高大上的東西,還不是特別的瞭解,不過基本是搞明白一些了。)

從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

第二個例子

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-> 會在同一作用範圍內嘗試調用私人方法,而 static:: 則可能給出不同結果。另一個區別是 static:: 只能用於靜態屬性。

第三個例子

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'

目前還不知道怎麼證明,但是可以知道一些東西,這個不是static範圍,所以有所屬的scope,而函數本身的scope只能是自己,而不能是別人,即使是繼承,除非用parent::來傳遞scope

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.