今天在看 Laravel 的容器(Container)實現時,發現了這麼一段忽然不能理解的代碼:php
** * 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了一下,發現這不就是以前所說的延遲靜態綁定嗎?這個概念我是懂的,但是在看實際應用時卻一時沒反應過來。google
這說明了一件事:自覺得懂的東西,可能其實並不懂。只有在實際環境中多看、多實踐、多總結,才能避免這種半懂不懂的狀態,才能深入理解一件事情。code
另外,new self
和 new static
的區別:二者都是實例化自身,區別在於繼承。若是沒有繼承,則二者返回的實例都是屬於一個類;若是有繼承,子類調用該方法,new self
仍然返回原類的實例,而 new static
返回實際子類的實例。這就是延遲靜態綁定,static 的值,使用的是最後實際調用那個方法的類。繼承
PS - 我的博客原文:理解 php new staticget