2014-04-19 52 views
11

我的PHP應用程序通常使用類來命名空間。這些類中的方法被定義爲靜態的。PHP:何時使用Traits以及何時使用靜態方法?

既然PHP已經引入了Traits,我正試圖圍繞什麼時候使用它們。我看到了一些使用特徵的例子,但我認爲這可以通過靜態類方法輕鬆實現。

使用記錄相當詳盡的例子在這裏列出:Traits in PHP – any real world examples/best practices?

但是,爲什麼使用特質,如果你也可以使用一個靜態的記錄器::日誌()?我現在唯一能想到的就是輕鬆訪問$ this。 我現在正面臨的另一個例子是用戶存在功能。特質呢,還是靜態的方法呢?

任何人都可以對此有所瞭解嗎?

+1

這兩個都是漂亮的垃圾在codebase imho中使用。 – PeeHaa

+0

@PeeHaa請詳細說明一下嗎? – Greggg

+0

由於耦合緊密,兩者都很難單元測試您的代碼。以及維護/調試它,因爲某種魔法「外部」代碼片段被「導入」到類中。 – PeeHaa

回答

12

閱讀關於這個問題的意見後,我採取的答案是這樣的:

性狀允許類的延伸沒有它的類層次結構的一部分。不需要像class Book extends Loggable之類的東西,因爲Book本身不是可登錄的,我們只需要Loggable功能。 Loggable中的功能可能被塞入特徵中,因此可以使用Book內的可登錄方法,就好像你是從它進行擴展一樣。

在類(或名稱空間函數)中使用靜態方法之上使用特徵的優點是特徵可以訪問整個類作用域,也可以使用私有成員。

使用靜態函數而不是特性的缺點是類之間存在緊耦合(依賴關係),這會傷害可重用性並且會傷害單元測試(例如使用模擬服務時)。應該在運行時注入依賴關係,這實際上增加了實例化類/方法的努力,但是在整個應用程序上允許更好的靈活性。對我來說這是一個新的見解。

-3

特徵可以訪問對象的私有成員。

相關問題