スーパークラス(親クラス)のメソッドを呼ぶ – parent::

クラスを継承した時、スーパークラスのメソッドを呼びたいときがあります。例えば、次のプログラムを見てみましょう。

<?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;

ともすたチャンネルに
チャンネル登録する