クラスを継承した時、スーパークラスのメソッドを呼びたいときがあります。例えば、次のプログラムを見てみましょう。
<?php
// 商品を管理するクラス
class Item {
protected int $price; // 価格
// コンストラクター
public function __construct($price) {
$this->price = $price;
}
}
// 書籍
class Book extends Item {
public int $page; // ページ数
// コンストラクター
public function __construct($price, $page) {
// ?
}
}
$book = new Book(1000, 100);
echo $book->page;
Itemというクラスを継承して、Bookというクラスが作られています。Bookには、「$page」という子クラス特有のプロパティが定義されていて、コンストラクターもそれぞれ定義されています。ここで、Bookクラスのコンストラクターを作成して行きましょう。ここでは、2つのパラメーターを受け取って、それぞれのプロパティを設定して行くため、次のように書くことはできます。
// コンストラクター
public function __construct($price, $page) {
$this->price = $price;
$this->page = $page;
}
しかし、スーパークラスのItemクラスでも同じような処理をしているため、ここで二重に書いてしまうのは効率が悪いですし、後でミスにつながりやすくなります。このような場合は、子クラスからスーパークラスのコンストラクターを呼び出します。この時、「parent::」という記述を利用しましょう。
// コンストラクター
public function __construct($price, $page) {
parent::__construct($price);
$this->page = $page;
}
これで、スーパークラスのコンストラクターによって初期化処理がされた後、子クラス特有の初期化処理をすることができます。この「::」という記述をスコープ定義演算子といい、parentの他に自身を指す「self」や静的メソッドを指す「static」などがあります。
完成プログラム
<?php
// 商品を管理するクラス
class Item {
protected int $price; // 価格
// コンストラクター
public function __construct($price) {
$this->price = $price;
}
}
// 書籍
class Book extends Item {
public int $page; // ページ数
// コンストラクター
public function __construct($price, $page) {
parent::__construct($price);
$this->page = $page;
}
}
$book = new Book(1000, 100);
echo $book->page;