| 修飾符 | 自身 | 子類 | 外部 | 繼承說明 |
| public | ✓ | ✓ | ✓ | 完全繼承,可重寫 |
| protected | ✓ | ✓ | ✗ | 子類可見,封裝內部細節 |
| private | ✓ | ✗ | ✗ | 不繼承,子類不可見,每個類擁有自己的私有副本 |
程式碼範例:父子類構造、方法重寫、權限擴大
<?php
class Person {
protected $name;
protected $age;
protected $sex;
public function __construct($name, $age, $sex) {
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
echo "Person 建構子執行<br>";
}
public function say() {
echo "我是 {$this->name},{$this->age} 歲,{$this->sex}<br>";
}
protected function eat() {
echo "吃飯中...<br>";
}
private function secret() {
echo "這是父類私有方法,子類不可見<br>";
}
}
class Student extends Person {
private $school;
public function __construct($name, $age, $sex, $school) {
// 必須顯式調用父類建構子(PHP 不會自動調用)
parent::__construct($name, $age, $sex);
$this->school = $school;
echo "Student 建構子執行<br>";
}
// 重寫 say(),擴展功能(權限 public 不可低於父類)
public function say() {
parent::say(); // 調用父類方法
echo "就讀於 {$this->school}<br>";
}
public function study() {
echo "{$this->name} 正在學習<br>";
$this->eat(); // 可調用父類 protected 方法
// $this->secret(); // 錯誤:私有方法不可見
}
}
$s = new Student("張三", 20, "男", "清華大學");
$s->say();
$s->study();
/*
輸出:
Person 建構子執行
Student 建構子執行
我是 張三,20 歲,男
就讀於 清華大學
張三 正在學習
吃飯中...
*/
?>
關鍵規則總結
- 建構子鏈:子類定義
__construct 時,必須手動呼叫 parent::__construct(),否則父類初始化邏輯不執行。
- 解構子鏈:同理,子類
__destruct 需呼叫 parent::__destruct()。
- 重寫權限:子類方法訪問權限 不能低於 父類(可放大,如 protected → public)。
- Final 關鍵字:父類方法/類別加
final 禁止重寫/繼承。
- 靜態成員:繼承規則相同,但屬於類別而非實例,透過
self::、parent::、static::(晚期靜態綁定)存取。
- 類別定義順序:父類必須先於子類定義(或透過自動載入機制保證載入順序)。
繼承 vs 組合
「組合優於繼承」:若關係為「擁有」而非「是一種」,優先用組合(持有對象引用),降低耦合,提高靈活性。繼承破壞封裝(子類依賴父類實現細節),濫用導致脆弱的類別層級結構。
- 上一篇文章: PHP 學習筆記(一):環境配置、WAMP 搭建與 Zend Studio 開發調試
- 下一篇文章: PHP 設計模式:Command(命令模式)封裝請求支援撤銷與佇列
Copyright ©
程式碼之家 All Rights Reserved