PHP - OOP - 10. オーバーライド
引き続き継承について学習していきましょう。
メソッドのオーバーライド
extends
キーワードによってスーパークラスに定義済みのプロパティやメソッドを再利用できることを学びました。それではスーパークラスに定義済みのメソッドと同名のメソッドをサブクラスに実装するとどうなるのでしょうか。以前に作成した MySubClass.php
ファイルを修正します。
<?php
require_once("MyClass.php");
class MySubClass extends MyClass
{
public function myMethod($x)
{
echo "Override!" . PHP_EOL;
}
public function myMethod2()
{
echo "Hello World!" . PHP_EOL;
}
}
ここではスーパークラスに定義済みのメソッドと同名である myMethod
という名前のメソッドを追加しています。このように実装することでスーパークラスのメソッドをサブクラスのメソッドで上書きすることができます。これをメソッドのオーバーライドと呼びます。
実際にオーバーライドしたメソッドを呼び出すプログラム( my_class_runner.php
)も確認しておきましょう。
<?php
require_once("MySubClass.php");
$mySubClass = new MySubClass("Hello");
$mySubClass->myMethod("Andy"); #=> Override!
$mySubClass->myMethod("Andy")
とメソッドを呼び出した場合、オーバーライドした MySubClass
クラスの myMethod
メソッドが呼ばれるため、画面には Override!
と出力されます。
PHPプログラムの開発(オーバーライド)
ここではさきほど作成した多機能計算機クラス( GreatCalc.php
)において show
メソッドをオーバーライドして計算結果の表示を Answer: 0
のような形式で出力するように修正します。
多機能計算機クラス( GreatCalc.php
)を次のように修正します。
<?php
require_once("SimpleCalc.php");
class GreatCalc extends SimpleCalc
{
protected $message = "Answer: ";
public function pow($x = 2)
{
$this->number = $this->number ** $x;
}
public function show()
{
echo $this->message;
echo $this->number . PHP_EOL;
}
}
GreatCalc
クラスでは $message
プロパティを追加して show
メソッドをオーバーライドしています。 show
メソッドでは $message
プロパティの値を出力してから計算結果であるスーパークラスの $number
プロパティを出力しています。
続いて実行プログラム( calc_runner.php
)ファイルです。こちらは以前と同じものを利用しましょう。
<?php
require_once("GreatCalc.php");
$calc = new GreatCalc();
$calc->add(2);
$calc->pow(3);
$calc->show();
$calc->show()
の呼び出し時には GreatCalc
クラスでオーバーライドした show
メソッドが呼び出されます。
それではターミナルからプログラムを実行してみましょう。
$ php calc_runner.php
Answer: 8
実行結果から GreatCalc
クラスでオーバーライドした show
メソッドが呼び出されているのがわかります。
まとめ
- 継承先のサブクラスでプロパティやメソッドを追加できる
- スーパークラスで定義済みのメソッドをサブクラスで上書きすることをオーバーライドと呼ぶ
- サブクラスのメソッドの処理において、スーパークラスのプロパティやメソッドにアクセスする場合はアクセス権に注意する