我們在使用php代碼新建對象的時候,一般會用到new self與new static,那么它們在使用的時候區別在哪里?
先說說new static(),new static與new self一樣,在php代碼中,它是用來新建一個對象的.
那么他們之間的不同之處在哪里呢?
new static與new self之間的不同在于在于新創建的是同一個類的實例與不同類的實例.
如下面這段示例:
class newdx {
public function hqnewself() {
return new self();
}
public function hqnewstatic() {
return new static();
}
}
$newdx = new newdx();
echo get_class($newdx->hqnewself());
echo get_class($newdx->hqnewstatic());
?>
以上代碼通過使用php自帶的get_class()方法是來用于獲取指定實例所屬類名
運行后可以得出,無論他們調用的是hqnewself()函數,還是hqnewstatic()函數,其結果都為newdx
然而當我們繼續創建
class newcl1 extends newdx {
}
class newcl2 extends newdx {
}
$newcl1 = new newcl1();
$newcl2 = new newcl2();
echo get_class($newcl1->hqnewself());
echo get_class($newcl1->hqnewstatic());
echo get_class($newcl2->hqnewself());
echo get_class($newcl2->hqnewstatic());
以上代碼表示newdx類有兩個子類,由于newdx類的hqnewself()和hqnewstatic()是公共的,所以在子類中依舊繼承了這兩方法。
其運行結果依次為newdx、newcl1、newdx、newcl2,無論是子類newcl1,還是子類newcl2,調用hqnewself()即new self()其返回的對象都是類newdx,而hqnewstatic()即 new static(),則返回了調用者子類的實例名稱.
他們的區別在類的繼承中才會顯示出來,當它們沒有任何繼承,那么使用他們沒有什么區別。
new self()返回的實例都是同一個類的實例,而new static()則是由調用的子類決定的.