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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **new self()與new static()** ``` new static 和 new self 都是實例化當前類, ``` 但是new static實例化所在的類,子類如果沒有重寫的話那么實例化的就是父類。 而new self就是嚴格的代碼里的當前類 兩者都是實例化自身,區別在于繼承。如果沒有繼承,則兩者返回的實例都是屬于一個類;如果有繼承,子類調用該方法,`new self`仍然返回原類的實例,而`new static`返回實際子類的實例。這就是延遲靜態綁定,static 的值,使用的是最后實際調用那個方法的類。 在函數返回值中有個@return static 表示的就是返回 new self對象 * * * ~~~ class ATest { public function say() { echo 'Segmentfault'; } public function callSelf() { self::say(); } public function callStatic() { static::say(); } } class BTest extends ATest { public function say() { echo 'PHP'; } } $b = new BTest(); $b->say(); // output: php:say方法被子類覆蓋了所以輸出PHP $b->callSelf(); // output: segmentfault:繼承的是父類的方法和屬性 $b->callStatic(); // output: php ~~~ self::屬性|方法 與 static::屬性|方法區別 self::屬性|方法調用的一定是當前類的如果子類沒有覆蓋父類才是父類的但是從另一個角度來說繼承父類的其實還是調用當前子類的 static::屬性|方法 后期靜態綁定 ``` class A { public static function who() { echo __CLASS__;//A } public static function test() { self::who();//A } } class B extends A { public static function who() { echo __CLASS__; } } B::test();//A test在A定義 ``` \--------------------------------------------------------下面的知識前必須知道------------------------------------------------------- class A { public function demo(){ echo \_\_CLASS\_\_; } } class B extends A { } $obj = new B; $obj->demo();//A 注意:繼承的話是繼承的父類的全部東西跟子類沒關系 使用 *self::* 或者 *\_\_CLASS\_\_* 對當前類的靜態引用,取決于定義當前方法所在的類: \------------------------------------------------------ class A { public static function who() { echo \_\_CLASS\_\_;//A } public static function test() { static::who();// 后期靜態綁定從這里開始 } } class B extends A { public static function who() { echo \_\_CLASS;//B } } B::test();//B static能夠讓你在上述例子中調用 *test()* 時引用的類是 *B* 而不是 *A* 后期靜態綁定本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中調用 *test()* 時引用的類是 *B* 而不是 *A*。最終決定不引入新的關鍵字,而是使用已經預留的 *static* 關鍵字。 *static也能對非靜態環境下的類進行操作* class A { private function foo() { echo "success!\\n"; } public function test() { $this->foo(); static::foo(); } } class B extends A { /\* foo() 將復制到 B, 因此它的范圍(作用域)任然是 A和調用成功\*/ } class C extends A { private function foo() { /\* 原來的方法被替代; 實例的范圍是 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 D:\\xampp\\htdocs\\phpceshi.php on line 9 \*/ 注意:在非靜態環境下,所調用的類即為該對象實例所屬的類。由于 *$this->* 會在同一作用范圍內嘗試調用私有方法,而 *static::* 則可能給出不同結果。另一個區別是 *static::* 只能用于靜態屬性。 \----------------------------------------------------------------------------------------------------------------- 后期靜態綁定的解析會一直到取得一個完全解析了的靜態調用為止。另一方面,如果靜態調用使用 *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();//輸出A C C ```
                  <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>

                              哎呀哎呀视频在线观看