1. 本記事のポイント
- PHPにおけるクラスの継承とメソッドのオーバーライドの仕組みを解説
- 実行可能なコードで基本構文と実務的な使い方を確認
- 実装時に注意すべきポイントや誤用例もあわせて紹介
2. PHPの継承・オーバーライドとは?
PHPにおいて、継承(Inheritance)とは、あるクラス(親クラス)の機能を別のクラス(子クラス)が引き継ぐ仕組みです。これにより、コードの再利用性が高まり、保守性の向上が図れます。
一方、オーバーライド(Override)は、親クラスで定義されたメソッドを子クラスで上書きして独自の実装に変更することを指します。これにより、基本的な振る舞いを保ちつつ、個別の挙動をカスタマイズできます。
これらはオブジェクト指向における「多態性(ポリモーフィズム)」を実現するうえで重要な要素です。実務では、ライブラリの拡張や業務ロジックの個別対応などに頻繁に用いられます。
PHPは単一継承のみをサポートしており、extends
キーワードでクラス継承を指定します。インターフェースやトレイトを併用することで、柔軟な設計も可能です。
3. 詳細解説
基本的な継承とオーバーライドの構文
まずは、親クラスのメソッドを子クラスでオーバーライドする基本構文を確認します。
<?php
class Animal {
public function speak() {
echo "鳴き声\n";
}
}
class Dog extends Animal {
public function speak() {
echo "ワンワン\n";
}
}
$dog = new Dog();
$dog->speak(); // 出力: ワンワン
Dog
クラスはAnimal
クラスを継承し、speak()
メソッドを独自実装で上書きしています。これがオーバーライドです。
親メソッドの呼び出しとparent::
の使い方
オーバーライド時に親のメソッドを明示的に呼び出したい場合は、parent::
を使います。
<?php
class Cat extends Animal {
public function speak() {
parent::speak(); // 親の鳴き声も呼ぶ
echo "ニャー\n";
}
}
$cat = new Cat();
$cat->speak();
// 出力:
// 鳴き声
// ニャー
parent::speak()
により、親の動作も引き継いだうえで、子の動作を追加できます。
final指定によるオーバーライドの禁止
final
キーワードを使うことで、子クラスによるオーバーライドを禁止できます。
<?php
class Base {
final public function greet() {
echo "こんにちは\n";
}
}
class Sub extends Base {
// public function greet() {} // エラー: finalメソッドは上書きできない
}
この制約は、フレームワーク設計などで「このメソッドの振る舞いは固定」と明示したい場合に使われます。
4. よくあるミス・誤解・落とし穴
- コンストラクタの継承忘れ:PHP8以降でも、親クラスのコンストラクタは自動で呼び出されません。必要に応じて
parent::__construct()
を明示する必要があります。 - アクセス修飾子の非互換:オーバーライド時には、親よりも制限の強いアクセス修飾子(例: public → private)にすることはできません。互換性違反でエラーになります。
- プロパティの上書きは別動作:プロパティを同名で再定義しても「オーバーライド」にはなりません。初期値の再定義や可視性の変更に注意が必要です。
- final指定の見落とし:サードパーティのクラスやライブラリでfinal指定されたメソッドをオーバーライドしようとしてエラーになるケースがあります。定義元の仕様確認が重要です。
5. まとめ
PHPの継承とオーバーライドは、オブジェクト指向設計における基本的な仕組みであり、コード再利用や処理のカスタマイズに有効です。
基本構文に加えて、parent::
やfinal
の使用、コンストラクタやアクセス修飾子との関係にも注意することで、安全かつ柔軟な実装が可能になります。