2012-02-29 74 views
6

可能重複:
traits in php – any real world examples/best practices?PHP中Traits的可能使用場景是什麼?

在什麼樣的情況將一個用性狀的PHP?我對此有一個非常好的總體思路,但我似乎無法想象在我寫的應用程序中使用它們的方式,但這可能是因爲它當時不需要特徵。

一種情況我已經意識到,需要性狀:

  • 活動。不要讓一個類實現觀察者模式並讓所有其他類繼承它,只要讓它成爲一個特徵並讓類想要觸發事件或訂閱使用特徵。例如,Yii框架通過在CComponent類中實現東西而不是使用Trait而做錯了。

基本上可以在類之間共享的功能,但可能沿着多個類層次結構傳播應該使用特徵。還有哪些場景可以利用Traits而不是事件系統?

回答

-4

Traits地址的問題與Java地址接口的問題類似 - 如何在不在同一類層次結構中的類之間強制執行通用行爲(由接口表示)。

對於僅具有繼承性的C++等語言,對於需要相同行爲的相同上下文中使用的兩個不同類的兩個對象,這兩個類必須來自同一層次結構。這有時意味着創建相當人爲的層次結構,只是爲了允許來自不同類的對象在相同的上下文中使用。

Java通過接口解決了這個問題 - 一個接口本質上是一個管理提供行爲的契約,以便一個類的對象可以替代一個單獨的類的對象,因爲它承諾了相同的行爲 - 接口。但他們不一定來自同一個層級。

PHP Traits體現了這個想法。特質是一種界面,是一類包含的一組行爲,因此它可以在需要該行爲的上下文中使用。所以,任何Java接口示例都應該繼承到PHP Traits示例。 PHP Traits與Java接口有點不同,因爲Traits可以包含完整的函數定義,而Java接口只能包含聲明(典型的PHP idiosyncrasy!)

+6

PHP也有[interfaces](http://php.net) /manual/en/language.oop5.interfaces.php),與性狀分開......!如果你想將蘋果與蘋果進行比較,特徵就像來自Ruby等語言的mixin,或者像Self這樣的語言的特徵。 – deceze 2012-02-29 08:16:02

+3

我不認爲接口與特質有很大關係。 – Tower 2012-02-29 08:17:04

+0

我會在這裏留下http://compsci.ca/v3/viewtopic.php?t=14785 – 2012-02-29 08:52:16

相關問題