【PHP】クラスのオーバーライドについて
目次
- クラスのオーバーライドとは
- メソッドのオーバーライド
- プロパティのオーバーライド
- コンストラクタのオーバーライド
- parentキーワードの活用
- オーバーライドを禁止するfinalキーワード
- 抽象クラスとオーバーライド
- インターフェースとオーバーライド
クラスのオーバーライドとは
PHPにおけるクラスのオーバーライド(Override)とは、親クラス(スーパークラス)のメソッドやプロパティを子クラス(サブクラス)で再定義することを指します。 これにより、継承したクラスの動作を変更したり、拡張したりできます。
メソッドのオーバーライド
PHPでは、子クラスで親クラスのメソッドを同じ名前で定義するとオーバーライドとなります。
class ParentClass {
public function greet() {
echo "こんにちは!";
}
}
class ChildClass extends ParentClass {
public function greet() {
echo "おはようございます!";
}
}
$obj = new ChildClass();
$obj->greet(); // 出力: おはようございます!
プロパティのオーバーライド
PHPではプロパティのオーバーライドも可能ですが、データ型やアクセス修飾子によっては警告が出ることがあります。
class ParentClass {
public string $message = "親のメッセージ";
}
class ChildClass extends ParentClass {
public string $message = "子のメッセージ";
}
$obj = new ChildClass();
echo $obj->message; // 出力: 子のメッセージ
コンストラクタのオーバーライド
コンストラクタもオーバーライドできます。子クラスでコンストラクタを再定義すると、親クラスのコンストラクタは呼ばれません。
class ParentClass {
public function __construct() {
echo "親クラスのコンストラクタ\n";
}
}
class ChildClass extends ParentClass {
public function __construct() {
echo "子クラスのコンストラクタ\n";
}
}
$obj = new ChildClass(); // 出力: 子クラスのコンストラクタ
parentキーワードの活用
子クラスから親クラスのメソッドを呼び出すには、parent::
を使用します。
class ParentClass {
public function greet() {
echo "こんにちは!";
}
}
class ChildClass extends ParentClass {
public function greet() {
parent::greet();
echo " おはようございます!";
}
}
$obj = new ChildClass();
$obj->greet(); // 出力: こんにちは! おはようございます!
オーバーライドを禁止するfinalキーワード
final
を使うと、オーバーライドを禁止できます。
class ParentClass {
final public function greet() {
echo "こんにちは!";
}
}
class ChildClass extends ParentClass {
// public function greet() { echo "おはようございます!"; } // エラー
}
抽象クラスとオーバーライド
抽象クラスでは、メソッドをオーバーライドすることが前提となっています。
abstract class ParentClass {
abstract public function greet();
}
class ChildClass extends ParentClass {
public function greet() {
echo "おはようございます!";
}
}
$obj = new ChildClass();
$obj->greet(); // 出力: おはようございます!
インターフェースとオーバーライド
インターフェースのメソッドも実装することでオーバーライドされます。
interface Greeting {
public function greet();
}
class MyClass implements Greeting {
public function greet() {
echo "こんにちは!";
}
}
$obj = new MyClass();
$obj->greet(); // 出力: こんにちは!