1. 程式人生 > >thinkphp5.1中的靜態延遲繫結應用

thinkphp5.1中的靜態延遲繫結應用

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類了。