クラスの継承
クラスはプロパティとメソッドが入った箱ですが、クラスの継承は、クラス(親クラス)をコピーして新しいクラス(子クラス)を作成することです。
継承はコピーですから、子クラスでも親クラスのプロパティとメソッドを利用できます。親クラスをベースに、子クラスで独自にプロパティやメソッドを追加やオーバーライド(上書き)します。親クラスと子クラスがまったく別物なら継承してはいけません。Person
を継承してage
を追加したPerson2
を作成する例です。
Person2
のクラス定義です。
class Person2 extends Person
{
private $age;
public function __construct($name, $age)
{
parent::__construct($name);
$this->age = $age;
}
public function getAge()
{
return $this->age;
}
}
extends
でクラスを継承します。親クラスからの変更分を子クラスでコーディングします。Person
を継承したので、Person2
でもgetName()
を使えます。
追加したプロパティage
をセットするために、コンストラクタをオーバーライドしました。プロパティname
は、親クラスのコンストラクタを転送コールparent::
してセットしました。転送コールは、後ほど説明します。追加したgetAge
をコールするとage
を取得できます。
$person_a = new Person2('suzuki', 28);
$person_a_age = $person_a->getAge();
var_dump($person_a_age);
int(28)
クラスを継承して子クラスを作成できる
トレイト
トレイトは、クラスと似たソースコードの再利用性を高めるための工夫です。trait
でプロパティやメソッドを定義し、それをクラスでuse
すると、クラス定義内に書き込んだものと同様に扱えます。
トレイトはクラス定義の一部であり、トレイトからインスタンスを作成することはできません。PHPの単一継承の制約を緩和するためにトレイトを利用できます。
トレイトを使ったPerson2
のクラス定義です。
trait Age
{
private $age;
public function getAge()
{
return $this->age;
}
}
class Person2 extends Person
{
use Age;
public function __construct($name, $age)
{
parent::__construct($name);
$this->age = $age;
}
}