国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

php后期靜態綁定例子講解

2019-11-08 01:02:27
字體:
來源:轉載
供稿:網友

php 5.3.0 起,PHP 增加了一個叫做后期靜態綁定的功能,用于在繼承范圍內引用靜態調用的類。 

1.self::限制

使用 self:: 或者 __CLASS__ 對當前類的靜態引用,取決于定義當前方法所在的類:

<?phpclass 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();?> 解釋:定義當前test方法的類為A,所以self代表類A。

輸出結果為: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();?> 解釋:static::不再被解析為定義當前方法所在的類,而是在實際運行時計算的。

輸出結果為:B

2.在非靜態環境下,所調用的類即為該對象實例所屬的類。由于 $this-> 會在同一作用范圍內嘗試調用私有方法,而static:: 則可能給出不同結果。另一個區別是static:: 只能用于靜態屬性。 

class 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();解釋:類C中沒有test()方法,所以類C的實例調用父類A中的test方法,此時處于父類A的作用于域中,無法調用C::foo()這私有方法,所以在使用static::foo()時會報錯Fatal error: Call to private method C::foo() from context 'A' ,但$this會嘗試調用同一作用域中的私有方法,即無法調用當前對象c的方法,就調用它父類的。

輸出結果為:

success! success! success! 

( ! ) Fatal error: Call to private method C::foo() from context 'A' 

3.后期靜態綁定的解析會一直到取得一個完全解析了的靜態調用為止。另一方面,如果靜態調用使用 parent:: 或者self:: 將轉發調用信息。

 轉發和非轉發調用

<?phpclass 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();?> 解釋:

所謂的"轉發調用"(forwarding call)指的是通過以下幾種方式進行的靜態調用:self::parent::static:: 以及forward_static_call()。可用get_called_class() 函數來得到被調用的方法所在的類名,static:: 則指出了其范圍。 

A::foo() 靜態直接指名到姓的調用A內靜態函數,輸出A

 parent::foo()是調用上一級的父類中的方法 ,此處為A,self::調用自身(類B)的foo()方法,類B中沒有foo()方法,則調用類A中的foo()方法。

A,B,C三個類里都有同一個名稱who()方法,根據覆蓋效應。系統會用優先級最高的,即C中的。輸出:C C


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 磐安县| 寻甸| 达拉特旗| 囊谦县| 泸水县| 仁布县| 辽源市| 扎兰屯市| 崇明县| 塔城市| 周至县| 滨州市| 卢湾区| 长寿区| 屏边| 朝阳市| 咸阳市| 金塔县| 读书| 青铜峡市| 正蓝旗| 普宁市| 金溪县| 满洲里市| 渑池县| 富锦市| 平罗县| 吉林市| 芒康县| 邵东县| 金塔县| 白水县| 搜索| 丰台区| 新竹县| 谢通门县| 北安市| 盐亭县| 全椒县| 平果县| 吉安县|