PHP 為弱型別語言,參數不固定、型別不嚴格,故不支援傳統「方法多載」(同名不同參數)。但在繼承體系中,子類別可「覆寫」父類別同名方法實現擴展。
<?php
class Person {
public $name, $sex, $age;
public function __construct($name, $sex, $age) {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function say() {
echo "我是 {$this->name},{$this->sex},{$this->age} 歲";
}
}
class Student extends Person {
public $school;
// 覆寫父類別建構子,並呼叫父建構子
public function __construct($name, $sex, $age, $school) {
parent::__construct($name, $sex, $age); // 推薦使用 parent::
$this->school = $school;
}
// 覆寫 say() 並擴展功能
public function say() {
parent::say(); // 保留父類別功能
echo ",就讀於 {$this->school}";
}
public function study() {
echo "{$this->name} 正在 {$this->school} 讀書";
}
}
$stu = new Student("小明", "男", 18, "某大學");
$stu->say(); // 我是小明,男,18歲,就讀於某大學
$stu->study(); // 小明正在某大學讀書
?>
| 方式 | 語法 | 優缺點 |
|---|---|---|
| 類別名稱 | Person::say() | 硬編碼父類別名稱,重構時需同步修改 |
| parent::(推薦) | parent::say() | 解耦父類別名稱,繼承樹調整只需改 extends |
PHP 採單一繼承:一個類別僅能直接繼承一個父類別。透過 extends 關鍵字實現:
<?php
// 基礎類別
class Person {
public $name, $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function walk() { echo "走路中..."; }
}
// 衍生類別:擴展而非重寫
class Student extends Person {
public $school;
public function __construct($name, $age, $school) {
parent::__construct($name, $age);
$this->school = $school;
}
public function study() { echo "在 {$this->school} 讀書"; }
}
// 繼承鏈
class GraduateStudent extends Student {
public $thesis;
public function research() { echo "研究 {$this->thesis} 中"; }
}
?>
parent::__construct()parent::__destruct()