PHP - OOP - 9. 継承
オブジェクト指向プログラミングでは、既存のクラスをベースにして新たなクラスを定義できます。このような仕組みを継承と呼びます。
クラスの継承
継承とは既存のクラスのプロパティやメソッドを引き継いで、新たなクラスを定義する仕組みです。継承を使うことでプログラムの再利用性を高めることができます。
PHPにおいてクラス間の継承関係を定義するには extends
キーワードを使います。ここでは MyClass
を継承して MySubClass
を作成する例を示します。次のプログラムを MySubClass.php
という名前を作成してみましょう。
<?php
require_once("MyClass.php");
class MySubClass extends MyClass
{
public function myMethod2()
{
echo "Hello World!" . PHP_EOL;
}
}
継承元のクラスをスーパークラスや親クラス、継承先(新たに作成するクラス)をサブクラスや子クラスなどと呼ぶこともあります。この例であれば MyClass
がスーパークラスであり、 MySubClass
がサブクラスです。サブクラスはスーパークラスのプロパティやメソッドを引き継ぎます。そのため呼び出し元となるプログラム( my_class_runner.php
)では次のように MySubClass
のインスタンスを操作できます。
<?php
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
プロパティのアクセスできるようにアクセス権を protected
や public
にしておく必要があります。次のように計算機クラス( 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
実行結果から 2
の 3
乗である 8
が出力されているのがわかります。
まとめ
- 継承とは、既存のクラスを新たなクラスで拡張する仕組み
class
キーワードでクラスを定義する際にextends
キーワードで継承元のクラスを指定する- 継承元のクラスのプロパティ、メソッドを継承先のクラスで再利用できる