PHPのオーバーライドのサンプルです。
目次
サンプル | オーバーライドとは |
子クラスから親クラスのインスタンスを参照する(parent::) | |
オーバーライドの禁止(final) |
オーバーライドとは
- クラスを継承したときに使用できます。
- 親クラスで定義したメソッドを、子クラスで同じメソッド名を記述して処理内容を上書きすることです。
- 似た名前として、オーバーロードがありますがそれとは別物です。
- 以下は、PHPマニュアルのクラスの基礎のリンクです。
https://www.php.net/manual/ja/language.oop5.basic.php
オーバーライドのサンプルです。
<?php
class Color1
{
public function getName1(){
return "赤";
}
}
class Color2 extends Color1
{
public function getName1(){
return "青";
}
}
$cr2 = new Color2();
print $cr2->getName1(); //青
?>
2~7行目は親クラスです。
8~13行目は子クラスです。
10行目がオーバーライドです。4行目とメソッド名「getName1」が同じで引数も同じ(なし)です。
15行目は親クラスと子クラスの両方にある「getName1」メソッドを実行しています。実行結果は子クラスのメソッドが実行されます。
子クラスから親クラスのインスタンスを参照する(parent::)
子クラスから親クラスのインスタンスを参照するサンプルです。
parent::を使用してオーバーライドした子クラスのメソッドから親クラスのメソッドを呼びます。
<?php
class Color1
{
public function getName1(){
return "赤";
}
}
class Color2 extends Color1
{
public function getName1(){
print parent::getName1();
return "青";
}
}
$cr2 = new Color2();
print $cr2->getName1(); //赤 青
?>
10行目は、4行目のメソッドをオーバーライドしています。
11行目は、parent::を使用して親クラスのメソッドを呼んでいます。
16行目は、親クラスと子クラスのメソッドの実行結果が表示されます。
オーバーライドの禁止(final)
メソッドの前にfinalをつけるとオーバーライドが禁止されます。
<?php
class Color1
{
final public function getName1(){
return "赤";
}
}
class Color2 extends Color1
{
//public function getName1(){
// return "青";
//}
}
$cr2 = new Color2();
print $cr2->getName1(); //
?>
10行目は、4行目のメソッドをオーバーライドしようとしていますが、4行目のメソッドの前にfinalがついているので不可です。エラーになります。
関連の記事