首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 子類重載父類方法與 parent:: 用法詳解

     編輯:PHP 綜合知識

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學校上學 ?>

使用 parent:: 調用父類方法

避免代碼重複,在子類中復用父類邏輯:

<?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}學校上學
"; } } ?>

關鍵規則與最佳實踐

1. 訪問權限限制

子類重寫方法的訪問權限 不能低於 父類:

  • 父類 public → 子類只能 public
  • 父類 protected → 子類可 protected 或 public
  • 父類 private → 子類不可重寫(不可見)

2. 方法簽名兼容

PHP 7.0+ 支援协变返回類型和逆变參數類型,但參數數量必須兼容。

3. 構造方法鏈調用模式

<?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);
    }
}
?>

4. 靜態方法與後期靜態綁定

<?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 魔術方法詳解》等專題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved