2014-11-05 93 views
3

this StackOverflow question我瞭解到self::不是遺傳感知,其中static::(在PHP中)。當涉及到在類中定義一堆常量時,如果要覆蓋子類中的那些常量以更改默認「行爲」,則有必要使用static::,以便引用常量,榮譽的父類方法「覆蓋」。static :: vs. self :: - 有沒有什麼缺點?

在2歲,因爲我問原來的問題,我一直在使用static::廣泛,給我很少用self::因爲self::點似乎限制使用常量類的可擴展性,其中static::沒有啓動這個限制。

即使我不目前打算恆定在子類中重寫,我最終使用static::,以防萬一 - 所以我沒有做一堆的搜索和替換後來,如果事實證明我想要擴展這個類並覆蓋這個常量。

但是,在別人的代碼中,我很少看到任何使用static::。直到2012年,我甚至不知道它存在。當然,爲什麼在self::的地方使用static::當然不是一般慣例?

我的問題的話,就是:是否有任何明顯缺點使用static::爲指的類的常量,而不是self::?我是否在這裏使用粗糙的反模式?

回答

0

其實它只取決於你需要的用途。如果您需要訪問您呼叫的類的常量,請使用self。如果您需要延遲靜態綁定,請使用static

從表演的角度來看,selfstatic是相當的。

也請注意,廣泛使用靜態組合來覆蓋/繼承不是一個好主意。

對於您的問題的直接回答,我總是傾向於使用static進行測試(即使PHPUnit 4刪除了對模擬靜態方法的支持)。

+1

感謝您的回答!爲什麼「廣泛使用靜態」不是一個好主意?請解釋。另外,爲什麼靜態更適合測試目的? – 2014-11-05 18:28:13

+0

有很多關於此主題的有用信息:http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/ – dynamic 2014-11-05 18:57:40

相關問題