thinkphp5.1中的靜態延遲繫結應用
阿新 • • 發佈:2018-11-12
PHP靜態延遲繫結:
當子類繼承父類時,有相同方法名的靜態方法,且呼叫的方法在父類已經有了的時候。使用self(即未進行靜態延遲繫結),會返回self所在的類的靜態方法。如果有需求是父類中的呼叫方法能夠呼叫到子類的靜態方法,就使用靜態延遲繫結。把self換成static即可。就是返回最終類的方法。
測試:
1)沒有任何處理時
<?php class A { public static $name = 'A'; public static function echoClass(){ echo __CLASS__ . self::$name; } //注意test方法 public function test(){ //直接使用self。返回的是self所在類的例項。這個self在類A裡。所以輸出的是AA echo self::echoClass(); } } class B extends A { public static $name = 'B'; public static function echoClass() { echo __CLASS__ . self::$name; } } $b = new B(); $b->test(); //輸出AA ?>
2)進行靜態延遲繫結後
<?php class A { public static $name = 'A'; public static function echoClass(){ echo __CLASS__ . self::$name; } //注意test方法 public function test(){ //由self改成了static。進行了靜態延遲繫結。所以最終是返回最終類的例項。所以將輸出BB echo static::echoClass(); } } class B extends A { public static $name = 'B'; public static function echoClass() { echo __CLASS__ . self::$name; } } $b = new B(); $b->test(); //輸出BB ?>
3)呼叫的方法在子類中
<?php class A { public static $name = 'A'; public static function echoClass(){ echo __CLASS__ . self::$name; } } class B extends A { public static $name = 'B'; public static function echoClass() { echo __CLASS__ . self::$name; } //注意test方法,已經到了B類中了。在使用self的情況下返回self所在類的例項,self在B類中所以將輸出 BB public function test(){ echo self::echoClass(); } } $b = new B(); $b->test(); //輸出BB ?>
thinkphp5.1中的Container容器類也用到了靜態延遲繫結。
而呼叫他的helper助手類呼叫了getInstance。此時容器池中就有helper的例項了。如果沒有進行靜態延遲繫結,物件例項就是Container類了。