「只關心介面或基類,不關心具體實現類。同一類型,不同結果。」
class Stu {
public function showGrade() { echo "base class"; }
}
class XiaoMin extends Stu {
public function showGrade() { echo "is son show 80"; }
}
class XiaoLi extends Stu {
public function showGrade() { echo "is son show 60"; }
}
function doit($obj) {
if (get_class($obj) != "Stu") { // 排除基類直接實例
$obj->showGrade();
}
}
doit(new XiaoLi()); // 輸出: is son show 60
doit(new XiaoMin()); // 輸出: is son show 80
特點: 基類定義標準,子類各自實現。但呼叫端仍需知曉具體子類型(new XiaoLi()),未完全面向介面程式設計。
interface Animal {
public function voice();
}
class Cat implements Animal {
public function voice() { echo "miao~~~<br>"; }
}
class Dog implements Animal {
public function voice() { echo "wang ~~~<br>"; }
}
function doVoice(Animal $obj) { // 參數型別限制為 Animal
$obj->voice();
}
doVoice(new Dog()); // 輸出: wang ~~~
doVoice(new Cat()); // 輸出: miao~~~
核心差異:
doVoice(Animal $obj) 強制參數必須實作 Animal 介面new Dog(),PHP 執行向上轉型,視為 Animal 型別Java 中寫法:Animal a = new Dog(); 顯式向上轉型。PHP 為弱型別語言,無編譯期型別檢查,透過 Animal $obj 型別提示在執行期驗證。