PHP - OOP - 8. 継承 - 1/3

オブジェクト指向プログラミングでは、既存のクラスをベースにして新たなクラスを定義できます。このような仕組みを継承と呼びます。

クラスの継承

継承とは既存のクラスのプロパティやメソッドを引き継いで、新たなクラスを定義する仕組みです。継承を使うことでプログラムの再利用性を高めることができます。

PHPにおいてクラス間の継承関係を定義するには extends キーワードを使います。ここでは MyClass を継承して MySubClass を作成する例を示します。

require_once("MyClass.php");

class MySubClass extends MyClass
{
    public function myMethod2()
    {
        echo "Hello World!" . PHP_EOL;
    }
}

また継承元のクラスをスーパークラスや親クラス、継承先(新たに作成するクラス)をサブクラスや子クラスなどと呼ぶこともあります。この例であれば MyClass がスーパークラスであり、 MySubClass がサブクラスです。サブクラスはスーパークラスのプロパティやメソッドを引き継ぎます。そのため次のように MySubClass のインスタンスを操作できます。

require_once("MySubClass.php");

$mySubClass = new MySubClass("Hello");
$mySubClass->myMethod("Andy"); #=> Hello Andy
$mySubClass->myMethod2(); #=> Hello World!

ここでは MySubClass のインスタンス対して、スーパークラスの MyClass に定義している myMethod メソッドの呼び出しが可能である点を確認してください。このように継承によってスーパークラスのプロパティやメソッドを再利用できます。

PHPプログラムの開発(継承)

ここでは計算機クラス( SimpleCalc.php )を継承して多機能な計算機クラス( GreatCalc.php )を作成します。

<?php
require_once("SimpleCalc.php");

class GreatCalc extends SimpleCalc
{
    public function pow($x = 2)
    {
        $this->number = $this->number ** $x;
    }
}

GreatCalc クラスは extends キーワードでスーパークラスに SimpleCalc クラスを指定しています。これによって SimpleCalc クラスのプロパティやメソッドを GreatCalc クラスでも利用できます。

GreatCalc クラスには新たに、べき乗を求める pow メソッドを定義しています。 pow メソッドの内部では、スーパークラスの $number プロパティにアクセスしています。このようなケースではサブクラスからも $number プロパティのアクセスできるようにアクセス権を protectedpublic にしておく必要があります。次のように計算機クラス( SimpleCalc.php )を修正します。

<?php
class SimpleCalc
{
    protected $number;

    // ...省略
}

ここではサブクラスである GreatCalc クラスから $number プロパティにアクセスできるように、アクセス権を protected に修正しています。

続いて実行プログラム( calc_runner.php )を次のように修正します。

<?php
require_once("GreatCalc.php");

$calc = new GreatCalc();

$calc->add(2);
$calc->pow(3);
$calc->show();

このプログラムでは $calc 変数に GreatCalc インスタンスの参照を代入しています。 GreatCalc クラスは SimpleCalc クラスを継承しているので $calc 変数に対して SimpleCalc クラスの add メソッドや show メソッドも呼び出すことができます。

それではコマンドラインからプログラムを実行してみましょう。

$ php calc_runner.php
8

実行結果から 23 乗である 8 が出力されているのがわかります。

まとめ

  • 継承とは、既存のクラスを新たなクラスで拡張する仕組み
  • class キーワードでクラスを定義する際に extends キーワードで継承元のクラスを指定する
  • 継承元のクラスのプロパティ、メソッドを継承先のクラスで再利用できる