2010-05-03 60 views
50

PHP中的接口是否具有屬性,還是隻有方法?PHP接口有屬性嗎?

+0

*(reference)* http://www.php.net/manual/en/language.oop5.interfaces.php – Gordon 2010-05-03 09:00:48

+2

問題是一個合理的問題,人們可以將一個類的公共屬性想象爲這些類的公共接口的一部分,並且可能希望強制實現接口的類來使某個命名屬性可用。 但是你不能 - 所以你只需要在界面中使用getProperty()setProperty()方法 - 這不是一件壞事,因爲每個人都知道公共屬性是邪惡的(我們都知道我們不是嗎? ?不是嗎?) – 2013-06-01 09:10:29

回答

28

這取決於你所說的「屬性」。如果你的意思是實際的領域,那麼不,他們不。如果你指的是像C#那樣的屬性,那麼他們可以(因爲無論如何,屬性訪問器完全是訪問器方法的語法糖)。這同樣適用於事件(當然,在每種情況下,沒有爲get/setadd/remove訪問器指定實現)。

更新:由於PHP不具有在get/set存取意識屬性,然後回答你的問題是沒有。接口不能攜帶自己的數據/狀態。

+3

常數被認爲是某些圈子中的數據。 ymmv – 2013-01-23 09:28:04

+1

@ nickl-這些圈子很瘋狂,因爲狀態發生了變化,常量沒有。 – mpen 2016-06-09 19:38:44

10

PHP接口可以有常量,但不包含屬性(實例變量)。如果你不需要修改你的「屬性」,你可以使用常量。

17

PHP中的接口可能只包含公共方法簽名沒有方法體。它們也可能包含常量。但就是這樣。沒有其他的。

http://www.php.net/manual/en/language.oop5.interfaces.php參見

接口所​​使用的接口關鍵字定義,以同樣的方式作爲標準類,但沒有任何的方法具有限定其內容。 [...]在接口中聲明的所有方法都必須是公共的,這是接口的本質。 [...]接口可能有常量。接口常量的工作方式與類常量完全相同,除非它們不能被繼承它的類/接口覆蓋。

-1

在接口中需要屬性的[有效]原因是指定DTO類具有某個方面,例如, IOrderable {OrderDate,OrderStatus},IDeliverable {DeliveryAddress,Route,...}等。該方面可以用於許多DTO中,例如銷售訂單,工作訂單,銷售發票等.DTO類可以支持多個方面,即數據類(而不是代碼類)中需要的多重繼承。此後,DTO的客戶確信它可以通過該方面(接口合同)查看DTO。這種模式遵守所有5個固體原則。

在PHP中,您最接近的屬性是特徵http://php.net/manual/en/language.oop5.traits.php。與接口類似,特徵不能被實例化,但是可以直接在類中使用而不實現它們。

+0

一個特徵決不會與接口「屬性」類似 - 也不是與接口非常相似。這只是錯誤的 – 2017-12-23 09:15:49

+0

接口是一個類的方法的藍圖,一個特性是一組方法/屬性,可以在不使用繼承或依賴注入的情況下在類之間輕鬆共享。 – 2017-12-23 09:30:48

+0

@A_funs編輯我的答案以澄清這一點 – Michael 2017-12-25 20:38:38