PHP 不支援方法重載,但子類可以覆蓋(重寫)父類方法。本文深入講解方法重寫機制、parent:: 調用父類方法、構造方法重寫模式以及訪問權限限制等核心概念。
經典例子:Bird 類有 fly() 方法,Ostrich(鴕鳥)繼承 Bird 但不會飛。必須在子類重寫 fly() 以修正行為。
<?php
class Person {
protected $name;
protected $sex;
protected $age;
public function __construct($name="", $sex="男", $age=1) {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function say() {
echo "我的名字:{$this->name},性別:{$this->sex},年齡:{$this->age}。
";
}
}
class Student extends Person {
private $school;
public function __construct($name="", $sex="男", $age=1, $school="") {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
$this->school = $school;
}
public function study() {
echo "{$this->name}正在{$this->school}學習
";
}
// 重寫父類方法
public function say() {
echo "我的名字:{$this->name},性別:{$this->sex},年齡:{$this->age},在{$this->school}學校上學
";
}
}
$student = new Student("張三", "男", 20, "edu");
$student->say();
// 輸出:我的名字:張三,性別:男,年齡:20,在edu學校上學
?>
避免代碼重複,在子類中復用父類邏輯:
<?php
class Student extends Person {
private $school;
public function __construct($name="", $sex="男", $age=1, $school="") {
// 調用父類構造方法初始化繼承屬性
parent::__construct($name, $sex, $age);
$this->school = $school;
}
public function say() {
// 調用父類 say() 輸出基本信息
parent::say();
// 追加子類特有信息
echo "在{$this->school}學校上學
";
}
}
?>
子類重寫方法的訪問權限 不能低於 父類:
public → 子類只能 publicprotected → 子類可 protected 或 publicprivate → 子類不可重寫(不可見)PHP 7.0+ 支援协变返回類型和逆变參數類型,但參數數量必須兼容。
<?php
class BaseController {
protected $db;
public function __construct() {
$this->db = new Database();
}
}
class UserController extends BaseController {
private $userModel;
public function __construct() {
parent::__construct(); // 必須顯式調用
$this->userModel = new UserModel($this->db);
}
}
?>
<?php
class A {
public static function who() { echo __CLASS__; }
public static function test() { self::who(); } // 早期綁定
public static function testLate() { static::who(); } // 後期靜態綁定
}
class B extends A {
public static function who() { echo __CLASS__; }
}
B::test(); // 輸出 A
B::testLate(); // 輸出 B
?>
更多 PHP 面向對象內容,請參考:《PHP 面向對象程序設計入門教程》、《PHP 設計模式實戰》、《PHP 魔術方法詳解》等專題。