首頁  >  文章  >  後端開發  >  php後期靜態綁定實例詳解

php後期靜態綁定實例詳解

小云云
小云云原創
2018-03-15 10:23:231117瀏覽

後期靜態綁定工作原理是儲存了在上一個「非轉送呼叫」(non-forwarding call)的類別名稱。

  • 當靜態方法呼叫時,該類別名稱即為明確指定的那個(通常在:: 運算子左側部分);

  • #當進行非靜態方法呼叫時,即為該物件所屬的類別。

所謂的「轉送呼叫」(forwarding  call)指的是透過以下幾種方式進行的靜態呼叫:self:: parent::static:: 以及forward_static_call() 。可用 get_called_class()函數來得到被呼叫的方法所在的類別名,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

static(後期靜態綁定)

後期靜態綁定本想透過引入一個新的關鍵字表示運行時最初呼叫的類別來繞過限制。簡單來說,這個關鍵字能夠讓你在上述範例中呼叫 test() 時所引用的類別是 B 而不是 A。最後決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。

範例:

<?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

static 和$this 的差異

在非靜態環境下,所調用的類別即為該物件實例所屬的類別。由於 $this-> 會在相同作用範圍內嘗試呼叫私有方法,而 static:: 則可能會給出不同結果。另一個差異是  只能用static:: 呼叫靜態屬性。

範例:呼叫私有方法

<?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

結果:

success!
success!
success!
Fatal error:  Call to private method C::foo() from context &#39;A&#39; in /tmp/test.php on line 9

轉送與非轉送呼叫

##後期靜態綁定的解析會一直到取得一個完全解析了的靜態呼叫資訊為止。另一方面,如果靜態呼叫使用

parent::self:: 將轉送呼叫訊息。

範例:

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();

結果:

ACC

 相關推薦:

PHP後期靜態綁定實例分享#

以上是php後期靜態綁定實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn