オーバーライドとは
オーバーライドは 親クラスのメソッドを子クラスで同名再定義し、動作を差し替える 仕組みだ。
Notifier::send() がデフォルトで "通知を送信しました" を出すとする。EmailNotifier extends Notifier で send() を再定義しておけば、$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 を継承した EmailNotifier で send() をオーバーライド |
📝 演習: ドリル 01 — EmailNotifier で send() をオーバーライド
やること
Notifier クラスを定義してください。
- メソッド
send()は"通知を送信しました"を 1 行出力する
Notifier を継承した EmailNotifier クラスを定義してください。
send()をオーバーライドして"メールで通知を送信しました"を 1 行出力する
EmailNotifier のインスタンスを作って send() を呼んでください。
期待される出力
メールで通知を送信しましたヒント
- 親と 同じ名前のメソッド を子に書けばオーバーライド
- 子のインスタンスでは、自動的に子のメソッドが呼ばれる
- 本物のメール送信は Symfony Mailer 等のライブラリを使うが、ここでは
echoでチャネルの差し替えを再現する