第10章 オブジェクト指向構文 / 第3回 模擬試験
PHPのオーバーライドに関する次の記述のうち、正しいものはどれか。
子クラスで親クラスと同名のメソッドを定義すると、親のメソッドが上書きされる。
正解
オーバーライドされた親クラスのメソッドは、子クラスから絶対に呼び出せない。
`final`を付けたクラスは、そのクラスのメソッドだけをオーバーライド禁止にする。
オーバーライドは、プロパティに対してのみ行うことができる。
解説
子クラスで親クラスと同じ名前・シグネチャのメソッドを定義すると、そのメソッドは子クラスの実装で上書き(オーバーライド)されます。
他の選択肢が誤りである理由は次の通りです。
・オーバーライドした親クラスのメソッドは、子クラスの中から`parent::メソッド名()`という書き方で呼び出せます。「絶対に呼び出せない」は誤りです。
・`final`をクラスに付けると、そのクラス自体の継承(`extends`)が禁止されます。特定のメソッドだけがオーバーライド禁止になるわけではなく、クラス全体が拡張不可になります(メソッド単位で禁止したい場合はメソッドに`final`を付けます)。
・オーバーライドはメソッドに対して行う概念です。プロパティは子クラスで再宣言すると型や可視性を変更できますが、メソッドのオーバーライドとは挙動が異なります。
例:
```
class Animal {
public function speak(): string { return '...'; }
}
class Dog extends Animal {
public function speak(): string {
return parent::speak() . ' Bow!';
}
}
echo (new Dog())->speak(); // ...Bow!
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.3.2節 メソッドのオーバーライド p.500〜504)