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

PHP 繼承機制深度解析:extends、訪問控制、方法重寫與構造鏈

     編輯:PHP 綜合知識

繼承核心概念

PHP 採用單繼承模型:一個子類只能繼承一個父類(extends),但可實現多個介面(implements)。子類自動擁有父類的非私有屬性與方法,可新增、覆寫(重寫),但不可減少(無法刪除父類成員)。

訪問控制與繼承關係

程式碼範例:父子類構造、方法重寫、權限擴大

<?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 歲,男
就讀於 清華大學
張三 正在學習
吃飯中...
*/
?>

關鍵規則總結

  1. 建構子鏈:子類定義 __construct 時,必須手動呼叫 parent::__construct(),否則父類初始化邏輯不執行。
  2. 解構子鏈:同理,子類 __destruct 需呼叫 parent::__destruct()。
  3. 重寫權限:子類方法訪問權限 不能低於 父類(可放大,如 protected → public)。
  4. Final 關鍵字:父類方法/類別加 final 禁止重寫/繼承。
  5. 靜態成員:繼承規則相同,但屬於類別而非實例,透過 self::、parent::、static::(晚期靜態綁定)存取。
  6. 類別定義順序:父類必須先於子類定義(或透過自動載入機制保證載入順序)。

繼承 vs 組合

「組合優於繼承」:若關係為「擁有」而非「是一種」,優先用組合(持有對象引用),降低耦合,提高靈活性。繼承破壞封裝(子類依賴父類實現細節),濫用導致脆弱的類別層級結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
修飾符自身子類外部繼承說明
public✓✓✓完全繼承,可重寫
protected✓✓✗子類可見,封裝內部細節
private✓✗✗不繼承,子類不可見,每個類擁有自己的私有副本