1. 程式人生 > >對比 PHP 中 new static() 與 new self()

對比 PHP 中 new static() 與 new self()

arr sta 創建 function turn dump self 區別 stat

通過new static()與new self()都能產生實例對象,new static()是在PHP5.3版本中引入的新特性,本文對二者稍作對比。

一、當直接通過本類創建實例時

class Test
{
    public static function getIns()
    {
        $obj1 = new self();
        $obj2 = new static();
        return [$obj1, $obj2];
    }
}
$arr = Test::getIns();
var_dump(get_class($arr
[0]) === get_class($arr[1])); // true

通過以上代碼可知,當直接從同一個類創建對象時,二者相同。

二、當子類繼承父類創建對象時

class Test
{
    public static function getIns()
    {
        $obj1 = new self();
        $obj2 = new static();
        return [$obj1, $obj2];
    }
}
class Test1 extends Test
{
    
}
class Test2 extends
Test { } $arr1 = Test1::getIns(); echo ‘Test1類繼承Test類通過self產生實例的類名: ‘, get_class($arr1[0]), ‘<br>‘; // Test echo ‘Test1類繼承Test類通過static產生實例的類名: ‘, get_class($arr1[1]), ‘<hr>‘; // Test1 $arr2 = Test2::getIns(); echo ‘Test2類繼承Test類通過self產生實例的類名: ‘, get_class($arr2[0]), ‘<br>‘; // Test
echo ‘Test2類繼承Test類通過static產生實例的類名: ‘, get_class($arr2[1]); // Test2

通過以上代碼可知,當子類繼承父類的情況下,self與static有所不同:

1、new self() 無論是子類還是父類誰調用,都指向被定義時它所在的類。

2、new static() 則由調用者決定,哪個類調用就指向哪個類。

總結:通過對比可知,new self() 與 new static() 區別在於是否繼承,如果沒胡繼承則二者效果相同,如果有繼承,則self仍指向被定義時的類,而static則指向調用者的類。

對比 PHP 中 new static() 與 new self()