オーバーライドとは

オーバーライドは 親クラスのメソッドを子クラスで同名再定義し、動作を差し替える 仕組みだ。

Notifier::send() がデフォルトで "通知を送信しました" を出すとする。EmailNotifier extends Notifiersend() を再定義しておけば、$mail->send()"メールで通知を送信しました" を出すようになる。継承だけだと親と同じ動きしかできないが、オーバーライドで「同じ呼び方で違う動き」を作れる。

書き方

親と同じ名前・同じ引数構造のメソッドを子クラスに書くだけ

class Notifier {
    public function send() {
        echo "通知を送信しました\n";
    }
}
class EmailNotifier extends Notifier {
    public function send() {
        echo "メールで通知を送信しました\n";  // 上書き
    }
}

PHP はインスタンスのクラスを見て、子に同名メソッドがあれば子を優先する (動的ディスパッチ)。

同じ呼び方で違う動き

$notifiers = [new EmailNotifier(), new SlackNotifier()];foreach で回して全部 send() を呼べる。ポリモーフィズム (多態) と呼ぶ書き方だ。

実務でもメール / Slack / SMS / Push のような複数チャネルを 同じ I/F で扱いたい場面で頻出する。呼ぶ側はチャネルの違いを気にしなくていい。

シグネチャの制約

子の引数の型・数と戻り値の型は 親と互換性を持つ必要 がある。PHP 7.4 以降は戻り値の 共変 (covariance) が許され、親の戻り値型を子で絞れる。

逆 (広げる) や引数を厳しく絞るのは互換性違反になる。まずは「同じシグネチャで上書きする」基本パターンに集中する。実メール送信は Symfony Mailer 等のライブラリを使うが、ここでは echo で代用する。

学習目標

ドリル

no 内容
01 Notifier を継承した EmailNotifiersend() をオーバーライド

演習: ドリル 01 — EmailNotifier で send() をオーバーライド

やること

Notifier クラスを定義してください。

Notifier を継承した EmailNotifier クラスを定義してください。

EmailNotifier のインスタンスを作って send() を呼んでください。

期待される出力

メールで通知を送信しました

ヒント

この章を AI に聞く

  1. 「ch02 — メソッドのオーバーライド」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch02 — メソッドのオーバーライド」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch02 — メソッドのオーバーライド」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch02 — メソッドのオーバーライド」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE