PHP - OOP - 9. オーバーライド

引き続き継承について学習していきましょう。

メソッドのオーバーライド

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 メソッドが呼び出されているのがわかります。

まとめ

  • 継承先のサブクラスでプロパティやメソッドを追加できる
  • スーパークラスで定義済みのメソッドをサブクラスで上書きすることをオーバーライドと呼ぶ
  • サブクラスのメソッドの処理において、スーパークラスのプロパティやメソッドにアクセスする場合はアクセス権に注意する