物件導向程式設計中,繼承是消除程式碼重複、實現多態的核心機制。本文透過完整的商城產品模型實例,深入解析 PHP 類別繼承的原理、語法與最佳實踐,展示如何設計清晰的類別階層結構。
繼承允許子類別(Child Class)取得父類別(Parent Class)的公共(public)與受保護(protected)屬性與方法。使用 extends 關鍵字建立繼承關係:
class ChildClass extends ParentClass { /* ... */ }
<?php
header('Content-Type: text/html; charset=utf-8');
class ShopProduct {
// 共同屬性
public $title;
public $producerMainName;
public $producerFirstName;
public $price;
public $numPages = 0; // 書籍專用
public $playLength = 0; // 光碟專用
public function __construct(
$title,
$firstName,
$mainName,
$price,
$numPages = 0,
$playLength = 0
) {
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
$this->numPages = $numPages;
$this->playLength = $playLength;
}
// 共同方法
public function getProducer() {
return "{$this->producerFirstName} {$this->producerMainName}";
}
public function getSummaryLine() {
return "{$this->title} ({$this->producerMainName}, {$this->producerFirstName})";
}
}
?>
class CdProduct extends ShopProduct {
// 擴展方法:取得播放長度
public function getPlayLength() {
return $this->playLength;
}
// 覆寫方法:提供光碟專屬摘要
public function getSummaryLine() {
$base = parent::getSummaryLine(); // 呼叫父類別方法
return "{$base}: playing time - {$this->playLength}";
}
}
class BookProduct extends ShopProduct {
// 擴展方法:取得頁數
public function getNumberOfPages() {
return $this->numPages;
}
// 覆寫方法:提供書籍專屬摘要
public function getSummaryLine() {
$base = parent::getSummaryLine(); // 呼叫父類別方法
return "{$base}: page count - {$this->numPages}";
}
}
<?php
// 實例化子類別(自動呼叫父類別建構子)
$product1 = new BookProduct("PHP 物件導向", "陳", "大明", 580, 350);
$product2 = new CdProduct("Laravel 實戰教學", "林", "小華", 1200, 0, "12小時");
// 存取繼承的方法
echo "作者: {$product2->getProducer()}<br>"; // 輸出: 林 小華
// 存取覆寫的方法(多態表現)
echo "書籍: {$product1->getSummaryLine()}<br>";
echo "光碟: {$product2->getSummaryLine()}<br>";
?>
呼叫 $product2->getProducer() 時:
getProducer()屬性存取遵循相同邏輯。
子類別未定義 __construct() 時,自動使用父類別建構子。但這導致父類別需處理所有子類別專屬參數,違反單一職責原則。
parent::method() 呼叫父類別實作,再添加子類別邏輯上述設計中,父類別建構子處理所有參數,不符合封裝原則。改善版本請參考下一篇文章「PHP parent 關鍵字應用」。
| 修飾詞 | 子類別可存取 | 外部可存取 | 說明 |
|---|---|---|---|
| public | 是 | 是 | 完全公開 |
| protected | 是 | 否 | 僅類別內部與子類別 |
| private | 否 | 否 | 僅定義該類別內部 |
final public function criticalMethod()abstract class BaseProductPHP 類別繼承透過 extends 關鍵字實現程式碼復用與多態。良好的繼承設計需遵循單一職責、開放封閉等 SOLID 原則,合理劃分父子類別責任邊界。理解方法搜尋機制、建構子繼承行為與可見性規則,是掌握 PHP 物件導向程式設計的關鍵基石。實際專案中,配合介面、Trait 與組合模式,能構建更彈性、可維護的系統架構。