萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 方法覆寫 完整教學:規則、範例與多型應用

什麼是方法覆寫?

子類別定義與父類別同名、同參數個數的方法,即為覆寫。呼叫時會優先執行子類別版本,實現多型。

基本範例

<?php
abstract class Animal {
    public $name;
    protected $price;

    public function cry() {
        echo "不知道動物怎麼叫..
"; } } class Dog extends Animal { public function cry() { // 覆寫 echo "小狗汪汪叫..
"; } } class Pig extends Animal { public function cry() { // 覆寫 echo "小豬哼哼叫..
"; } } $animal = new Animal(); $dog = new Dog(); $pig = new Pig(); $animal->cry(); // 不知道動物怎麼叫.. $dog->cry(); // 小狗汪汪叫.. $pig->cry(); // 小豬哼哼叫.. ?>

覆寫規則細節

  1. 方法名、參數個數必須相同,參數名稱可不同。
  2. 存取修飾符:子類別 ≥ 父類別(如父 protected,子可 public,不可 private)。
  3. 父類別 private 方法不可被覆寫(根本不會被繼承)。
  4. 子類別呼叫父類別實作:parent::methodName() 或 ParentClass::methodName()。

多型實際應用場景

<?php
interface Validator {
    public function isValid($value): bool;
}

class MoreThanZeroValidator implements Validator {
    public function isValid($value): bool { return $value > 0; }
}

class EvenValidator implements Validator {
    public function isValid($value): bool { return $value % 2 === 0; }
}

class ArrayProcessor {
    private Validator $rule;
    public function __construct(Validator $rule) { $this->rule = $rule; }
    public function process(array $numbers) {
        foreach ($numbers as $n) {
            if ($this->rule->isValid($n)) echo "$n ";
        }
    }
}

// 客戶端:注入不同驗證策略
$processor = new ArrayProcessor(new EvenValidator());
$processor->process([1, 20, 18, 5, 0, 31, 42]); // 輸出 20 18 0 42
?>

常見錯誤與除錯提示

  • ❌ 參數型別宣告不一致(PHP 7.0+ 嚴格模式下會報錯)。
  • ❌ 父方法為 final 禁止覆寫。
  • ❌ 嘗試覆寫 private 或 static 方法(static 屬於類別,非實例,稱「隱藏」而非覆寫)。

總結

方法覆寫是 OOP 多型核心,配合介面/抽象類別可實現策略模式、命令模式等設計模式,提升程式碼彈性與可維護性。

copyright © 萬盛學電腦網 all rights reserved