今天在看 Laravel 的容器(Container)實現時,發現了這么一段突然不能理解的代碼:
**
* Set the globally available instance of the container.
*
* @return static
*/
public static function getInstance()
{
if (is_null(static::$instance)) {
static::$instance = new static;
}
return static::$instance;
}
這個函數的功能很容易知道的,就是實例化一個全局唯一的容器,不理解之處在於:new static
,這個表達式。之前我們自己寫單例的時候都是用 new self
,也並沒有什么不對。
google了一下,發現這不就是之前所說的延遲靜態綁定嗎?這個概念我是懂的,可是在看實際應用時卻一時沒反應過來。
這說明了一件事:自以為懂的東西,可能其實並不懂。只有在實際環境中多看、多實踐、多總結,才能避免這種半懂不懂的狀態,才能深刻理解一件事情。
另外,new self
和 new static
的區別:兩者都是實例化自身,區別在於繼承。如果沒有繼承,則兩者返回的實例都是屬於一個類;如果有繼承,子類調用該方法,new self
仍然返回原類的實例,而 new static
返回實際子類的實例。這就是延遲靜態綁定,static 的值,使用的是最后實際調用那個方法的類。
PS - 個人博客原文:理解 php new static