クラスの継承
クラスはプロパティとメソッドが入った箱ですが、クラスの継承は、クラス(親クラス)をコピーして新しいクラス(子クラス)を作成することです。
継承はコピーですから、子クラスでも親クラスのプロパティとメソッドを利用できます。親クラスをベースに、子クラスで独自にプロパティやメソッドを追加やオーバーライド(上書き)します。親クラスと子クラスがまったく別物なら継承してはいけません。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;
}
}

