2010-11-13 19 views
6

可能重複:
What is the point of interfaces in PHP?我爲什麼要在PHP中創建接口?

我爲什麼要創建PHP接口?

據我所知,接口在那裏描述實現它們的類。類必須至少包含這些函數。如果你正在構建別人的工作,或者必須保持一定程度的兼容性,這一切都很好。但是在更簡單的情況下?

我知道,對於編譯的編程語言,如C++,接口的使用可以提高編譯速度,但PHP呢?這個好處似乎消失了,因爲PHP被解釋,而不是編譯。

+0

我曾經這樣想過,但實際上PHP被編譯爲字節碼。當你執行腳本時,首先發生的事情是編譯。這就是爲什麼你可以使用像APC這樣的字節碼緩存。 – JAL 2010-11-13 19:27:49

+0

接口用於代替多重繼承。在PHP中,他們也可以在對象上提供一些語法特徵,參見SPL類或ArrayAccces。 – mario 2010-11-13 19:30:35

+0

[PHP中的接口是什麼?]的副本(http://stackoverflow.com/questions/20463/what-is-the-point-of-interfaces-in-php) – Gordon 2010-11-14 00:05:35

回答

1

也許現實世界的例子將有助於說明這一點。想象一下,您需要構建一系列記錄類,將消息記錄到各種媒體,如文本文件,XML或數據庫。當然,每個類都需要有獨立的代碼來與不同類型的存儲進行交互。但是,如果他們都實現相同的接口,那麼他們向其他代碼顯示的「公共面孔」總是相同的。這樣,使用日誌對象的其他代碼就不需要知道它們是什麼類,它們是存儲介質的實例還是什麼。他們需要知道的一切就是所有的日誌記錄類,由於它們都實現了相同的接口,所以共享一個通用的API。這可能是一種非常強大的工作方式。您可以建立一個代碼庫,以不同的方式解決相關問題,只需在代碼中「即插即用」即可。

+0

謝謝!這對我來說更加清晰。雖然其他答案包含很多額外的信息,但這讓我感到困惑。 – 2010-11-13 20:27:23

1

接口是一種「模擬」多重繼承的方式。 PHP中的類只能擴展一個父類,但可以實現任意數量的接口,從而允許創建具有多種不同類型的對象。

1

接口用於擴展/模擬核心PHP行爲,如迭代器,數組訪問等。這是接口給你的主要東西......也就是說,你不能以任何其他方式進行。

您還可以使用接口來執行參數檢查:

function foo(MyInterface $obj) 
{ 
} 

雖然作爲編譯時檢查,你會得到另一種語言而不是有用的(例如,C++),運行時檢查仍然很有助於最大限度地減少錯誤。

最後,通過使用is_a函數或instanceof運算符,接口可以簡化某些邏輯。你可以檢查「抽象」對象是否實現了某個接口,然後做相應的處理。

+0

您的回答不正確。仿真/擴展核心PHP行爲?接口用於在子類中實施標準API。如果正確實施,您可以切換出不同的類,並且不會有任何不兼容性。 – 2010-11-13 23:06:42

+0

要麼你是無知的,或只是迂腐。例如,如果您希望您的對象通過'[]'數組語法來模擬(擴展,模仿,作爲任何您喜歡的)數組,則必須實現ArrayAccess接口。沒有其他辦法可以做到這一點。還有許多其他內置接口提供了核心PHP功能。 – Matthew 2010-11-14 00:44:59

0

接口的使用與速度無關,永遠不會。 但它與解耦和抽象有很大關係。

您將在PHP中使用它們:

  1. 隱藏實現 - 建立接入協議以一類對象的改變底層實現的,而不在所有你使用的對象
  2. 的地方重構要檢查類型 - 爲確保參數有一個特定類型的$object instanceof MyInterface
  3. 要強制參數在運行時檢查 - 見@konforce回答
  4. 實現多個行爲成一個類(構建複雜的類型)

    類汽車實現EngineInterface,BodyInterface,SteeringInterface {

使得Car對象CA現在start()stop()(EngineInterface)或goRight()goLeft()(轉向接口)

和其他我現在無法想象的東西

來自Java中的思考:

一個接口說:「這就是所有實現這個特定接口的類都是這樣的。」因此,任何使用特定接口的代碼都知道可能爲該接口調用哪些方法,就這些。所以這個接口被用來在類之間建立一個「協議」。

相關問題