請問我在書上看到介面的說明如下:
interface Openable{
function eat();
}
class Door implements Openable{
public function open(){
// 程式碼
}
}
class Jar implements Openable{
public function open(){
// 程式碼
}
}
function openSomething(Openable $obj){
$obj->open();
}
$objDoor = new Door();
$objJar = new Jar();
openSomething($objDoor);
openSomething($objJar);
如果類別單獨設定如下:
這樣不是也可以用這二個類別嗎?
想請問那為何要多設定介面這個步驟呢?
介面到底是什麼意思呢,有沒有什麼具體的例子能解釋呢?
感謝
class Door{
public function open(){
// 程式碼
}
}
class Jar{
public function open(){
// 程式碼
}
}
$objDoor = new Door();
$objDoor->open();
$objJar = new Jar();
$objJar->open();
介面就是字面上的意思啊,它規定了一個物件應該要有什麼方法可以呼叫,也規定了要用到哪些參數。所以當物件實作了一個介面的時候,它就一定要有這個方法,不然會跳錯誤訊息。
所以當你的函式宣告成接受一個界面的時候,你可以放心的在裡面呼叫而不用擔心傳進來的這個物件到底有沒有這個方法能用:
function openSomething(Openable $obj){
// 強制要實作 open() 所以放心呼叫
$obj->open();
}
function openSomethingMayNotOpenable($obj){
// 可靠嗎? $obj 到底有沒有 open() 可用?
$obj->open();
}
在強型別的語言例如 Java 或是 C++,一個函式要接受不同種類的物件作為參數,要嘛這物件是有繼承關係,不然就必須實作某些界面。而在 PHP 因為是弱型別語言,所以並沒有這樣的硬性規定。因此介面多用在設計函式庫的時候,或是做比較大比較正式的專案時使用。比較好的 IDE 也會根據你定義的介面來提供一些方便的提示或檢查。
結論就是你可以根據你的情況來決定是否採用 Interface。順帶一提,像你講的那樣不使用介面,而是依賴開發者自己檢查確認能呼叫 open() 的作法,又稱為 Duck typing。