クラスの応用 / 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(); // 「何かの声」 が出る- でも犬は「ワン」、猫は「ニャー」と鳴かせたい
- 子クラスごとに動きを変えたい
子クラスで同じ名前のメソッドを書く
<?php
class Animal {
public function speak() {
echo "何かの声\n";
}
}
class Cat extends Animal {
public function speak() {
echo "ニャー\n";
}
}- 子クラスで親と 同じシグネチャ のメソッドを定義
- これを オーバーライド と呼ぶ
子のインスタンスでは子のメソッドが呼ばれる
<?php
$c = new Cat();
$c->speak();実行結果:
ニャー
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();
}- 全部
speak()で呼べる - 実行されるのは そのインスタンスのクラスのメソッド
このチャプターでできるようになること
✅ 親と同名のメソッドを子で再定義できる ✅ 子のインスタンスでは子のメソッドが呼ばれる ✅ 同じ呼び方でクラスごとに違う動きをさせられる
→ ドリルへ
演習問題(1問)
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリ(nomuraya-dojo/php)を clone してください。