<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                自 PHP 5.3.0 起,PHP 增加了一個叫做后期靜態綁定的功能,用于在繼承范圍內引用靜態調用的類。 準確說,后期靜態綁定工作原理是存儲了在上一個“非轉發調用”(non-forwarding call)的類名。當進行靜態方法調用時,該類名即為明確指定的那個(通常在 :: 運算符左側部分);當進行非靜態方法調用時,即為該對象所屬的類。所謂的“轉發調用”(forwarding call)指的是通過以下幾種方式進行的靜態調用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函數來得到被調用的方法所在的類名,static:: 則指出了其范圍。 該功能從語言內部角度考慮被命名為“后期靜態綁定”。“后期綁定”的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態綁定”,因為它可以用于(但不限于)靜態方法的調用。 ## self:: 的限制 使用 self:: 或者 __CLASS__ 對當前類的靜態引用,取決于定義當前方法所在的類: ### Example #1 self:: 用法 <?php 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 ## 后期靜態綁定的用法 后期靜態綁定本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。 ### Example #2 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 Note: >在非靜態環境下,所調用的類即為該對象實例所屬的類。由于 $this-> 會在同一作用范圍內嘗試調用私有方法,而 static:: 則可能給出不同結果。另一個區別是 static:: 只能用于靜態屬性。 ### Example #3 非靜態環境下使用 static:: <?php 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(); //fails ?> 以上例程會輸出: success! success! success! Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9 Note: >后期靜態綁定的解析會一直到取得一個完全解析了的靜態調用為止。另一方面,如果靜態調用使用 parent:: 或者 self:: 將轉發調用信息。 ### Example #4 轉發和非轉發調用 <?php 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(); ?> 以上例程會輸出: A C C Note: >new static 就是實例化最終繼承的類,而new self就是實例化當前類, new parent就是實現當前類的父類了 #### Example #4的執行結果解釋 基礎的static是相對于public的,面向編程時影響繼承權限 由圖的繼承關系可知:C徹底包含了B和A。 在看答案結果以前,他細觀察發現,三個類里都有同一個名稱who()方法。 系統會用最后一個優先級最高,進一步的說,你幾乎沒法通過C去調用A、B內的who(),只能重改方法,比如添加個getBWho(){echo B::who();} 然后通過C::getBWho();來調用B內的who(); 下面來看運行結果: test只在B中出現,所以結果必然是test()中運行的三個結果: 第一個:靜態直接指名到姓的調用A內靜態函數,這沒有懸念,必然是A 第二個:parent::是調用上一級的父類,在此題中為A,A中又直接調用static:who();上面說過了,這個who()優先級最高的在C里面,無論在你ABC中哪里調用,只要是static::who()必然是最后定義的那個,覆蓋效應,如果想調用A里的必需指明A::who()或是通過去除static從作用域限制來實現。所以這個who()就是C中定義的who 第三個:self::who與第二個類似的問題,看樣該走B的,注意覆蓋效應,要想調用B內的who必須得B::who(),因為更高級的C已經重寫了這個方法,如果C中沒有who,肯定就是B,依次類推。所以必然還是調用C中的who; 所以答案為:ACC ## php官方文檔-后期靜態綁定 http://php.net/manual/zh/language.oop5.late-static-bindings.php
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看