クラスの応用 / ch02

メソッドのオーバーライド

<!-- LLM_CONTEXT: Lesson 9 / Chapter 2 目的: 親クラスのメソッドを子クラスで同名再定義 (オーバーライド) して動作を差し替える 扱わない: parent:: で親メソッド呼び出し (ch03) / abstract (ch04) / interface (ch05) 読み上げ時間目安: 3 分半〜4 分 -->

メソッドのオーバーライド

Lesson 9 / Chapter 2


継承だけだと、親と全く同じ動きになる

<?php
class Animal {
    public function speak() {
        echo "何かの声\n";
    }
}

class Cat extends Animal {
}

$c = new Cat();
$c->speak();   // 「何かの声」 が出る
▶ 3v4l で実行
  • でも犬は「ワン」、猫は「ニャー」と鳴かせたい
  • 子クラスごとに動きを変えたい

子クラスで同じ名前のメソッドを書く

<?php
class Animal {
    public function speak() {
        echo "何かの声\n";
    }
}

class Cat extends Animal {
    public function speak() {
        echo "ニャー\n";
    }
}
▶ 3v4l で実行
  • 子クラスで親と 同じシグネチャ のメソッドを定義
  • これを オーバーライド と呼ぶ

子のインスタンスでは子のメソッドが呼ばれる

<?php
$c = new Cat();
$c->speak();
▶ 3v4l で実行

実行結果:

ニャー
  • Cat には speak() が定義されているので、親 Animal::speak() は使われない
  • 親のメソッドは 上書き された状態になる

同じ呼び方で、クラスごとに違う動き

<?php
class Dog extends Animal {
    public function speak() {
        echo "ワン\n";
    }
}

class Cat extends Animal {
    public function speak() {
        echo "ニャー\n";
    }
}

$animals = [new Dog(), new Cat()];
foreach ($animals as $a) {
    $a->speak();
}
▶ 3v4l で実行
  • 全部 speak() で呼べる
  • 実行されるのは そのインスタンスのクラスのメソッド

このチャプターでできるようになること

✅ 親と同名のメソッドを子で再定義できる ✅ 子のインスタンスでは子のメソッドが呼ばれる ✅ 同じ呼び方でクラスごとに違う動きをさせられる

→ ドリルへ

演習問題(1問)

  1. ドリル 01 — Cat で speak() をオーバーライド

    starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリ(nomuraya-dojo/php)を clone してください。