【PHP】parent - スーパークラスのメソッド呼び出し

【PHP】parent - スーパークラスのメソッド呼び出し

スーパークラスを表すparentキーワードがあります。

parentキーワードを使うことで、サブクラスからスーパークラスのメソッドを呼び出すことが可能です。

ここでは、parentキーワードについて解説します。

検証環境

parent

parentキーワードは“スーパークラスを表すキーワード”です。

クラス内で使用し、スーパークラスのメソッド等にアクセスするために使用します。

また、オーバーライドしたメソッドでもparentキーワードを使うことで、スーパークラスのメソッドを呼び出すことが可能です。

基本構文

parent::メソッド名(実引数1, 実引数2 ...)

parentキーワードに続いて、ダブルコロン(::)を記述し、呼び出すメソッドを指定します。

サンプル

<?php

// 人間クラス
class Person {
    
    public function greeting() {
        echo "Hey!\n";
    }
    
}

// 教師クラス
class Teacher extends Person {
    
    public function greeting() {
        ___ih_hl_start
        parent::greeting();
        ___ih_hl_end
        echo "I'm a teacher.\n";
    }
    
}

$teacher = new Teacher();

$teacher->greeting();

?>
$ php sample.php
Hey!
I'm a teacher.

16行目がparentキーワードを使ったスーパークラスのメソッド呼び出しです。

実行結果から24行目のgreetingの呼び出しで、スーパークラスであるPersonクラスのgreetingメソッドを初めに呼び出していることが分かります。

コンストラクタ

コンストラクタはメソッド名が決まっているため、定義するとスーパークラスのコンストラクタをオーバーライドします。

オーバーライドするとスーパークラスの初期化処理(コンストラクタの処理)が実行されません。

そのため、サブクラスでスーパークラス部分を初期化する必要がありますが、サブクラスのコンストラクタに同じようなコードを書くことになり、コードが複雑になります。

そこで、一般的にはparentキーワードを使い、コンストラクタを呼び出して初期化処理を引き継ぐことが推奨されます。

<?php

// 人間クラス
class Person {
    
    // 名前
    public $name;
    
    // コンストラクタ
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    // あいさつ
    public function greeting() {
        echo "Hey!\n";
        echo "My name is ". $this->name . ".\n";
    }
    
}

// 教師クラス
class Teacher extends Person {
    
    // 担当科目
    public $subject;
    
    // コンストラクタ
    public function __construct( $name, $subject ) {
        ___ih_hl_start
        parent::__construct($name);
        ___ih_hl_end
        $this->subject = $subject;
    }
    
    // あいさつ
    public function greeting() {
        echo "Hello.\n";
        echo "I'm a " . $this->name . ", a " . $this->subject . " instructor.\n";
    }
    
}

$teacher = new Teacher('TANAKA', 'Programming');

$teacher->greeting();

?>
$ php sample.php
Hello.
I'm a TANAKA, a Programming instructor.

30行目がスーパークラスのコンストラクタの呼び出しです。

スーパークラス部分の初期化はスーパークラスのコンストラクタを使うことで、簡潔に初期化することができます。

アクセス修飾子の制限

アクセス修飾子がprivateなプロパティ(フィールドやメソッド)はparentキーワードでアクセスできません。

アクセス修飾子については別途解説しますが、ここでは、publicまたはprotectedなプロパティのみparentキーワードでアクセスできることを覚えておきましょう。

演習問題

問題1

次の実行結果になる会計プログラムを作成してください。
なお、下記条件を満たすものとします。

  • 小計クラス(Subtotal)を作成する
  • 小計クラスは複数料金を記憶する$pricesフィールド(配列)を持つ
  • 小計クラスは小計金額を計算するcalcメソッドを持つ(小計金額は$pricesに記憶された値の合計値)
  • 会計クラス(Bill)を作成する
  • 会計クラスは小計クラスを継承する
  • 会計クラスはcalcメソッドをオーバーライドし、小計に消費税を加算した値を計算する。
    ※ 消費税率は10%とします。
  • 会計クラスのcalcメソッドは小計クラスのcalcメソッドを使う
  • 料金は標準入力で与える(空文字を入力するまで)
$ php practice.php
1000
2300
3500

合計金額 : 7480円

問題2

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 下記表の3つのクラスを作成する
  • 実行結果になるように各クラスのインスタンスを使う
クラス 英記 継承元 フィールド メソッド
チケットクラス Ticket なし $price(料金) info()
→ $priceの値を出力
ライブチケット LiveTicket Ticket $place(場所) info()
→ 場所と料金を出力
※ スーパークラスのinfoメソッドを利用する
ライブ配信チケット LiveStreamingTicket Ticket $url(URL) info()
→ URLと料金を出力
※ スーパークラスのinfoメソッドを利用する
===== チケット    =====
料金 : 5000円
===== ライブチケット =====
料金 : 8000円
場所 : ライブハウス
===== ライブ配信   =====
料金 : 3000円
URL : https://it-hack.net/live-streaming