概要
オーバーライドした子メソッドの中から 親の処理も走らせたい ときがある。例えば子の greet() で「親の挨拶を出した後に、子独自のメッセージを追加する」ような合成だ。このために PHP には parent::method() という記法があり、子のメソッド内から親クラスのメソッドを明示的に呼び出せる。parent::greet(); を実行すると、いま自分が動いているクラスの 親の同名メソッド が呼ばれる。
parent:: は 「親を捨てずに拡張する」 ためのキーで、特に コンストラクタの連鎖 で重要になる。親クラスが __construct(string $name) で何かを初期化しているなら、子クラスのコンストラクタの最初の行で parent::__construct($name); を呼んでおかないと、親側の初期化が走らずプロパティが未初期化のまま残ってしまう。「子コンストラクタの先頭で parent::__construct() を呼ぶ」は実務で頻出する慣習になる。
$this->method() と parent::method() の違いを区別しておく。$this->method() はオーバーライドを考慮して 実体のクラスのメソッド を呼ぶ (子で上書きされていれば子が走る)。parent::method() は明示的に 親のメソッド を呼ぶ。同じ名前で書ける場合でも、意図がまったく違うので使い分けに注意する。
学習目標
parent::method()で親クラスのメソッドを明示的に呼べる- オーバーライドした上で親の処理も走らせる「合成」ができる
- 親の処理を捨てずに拡張する書き方を理解する
ドリル
| no | 内容 |
|---|---|
| 01 | 子クラスの greet() で parent::greet() を呼んで合成する |
📝 演習: ドリル 01 — parent::greet() を呼ぶ
問題
Greeter クラスを定義してください。
- メソッド
greet()は"こんにちは"を 1 行出力する
Greeter を継承した FormalGreeter クラスを定義してください。
greet()をオーバーライドし、まずparent::greet()を呼んでから"本日はお世話になります"を 1 行出力する
FormalGreeter のインスタンスを作って greet() を呼んでください。
期待される出力:
こんにちは
本日はお世話になりますヒント
parent::greet();で親の処理を呼べる- その後に追加の
echoを書く