ITHACK
~ みんなのIT部門 ~

【PHP】オーバーライド – スーパークラスのメソッドをサブクラスで再定義する

クラスの継承ではオーバーライドと呼ばれる仕組みがあります。
オーバーライドはサブクラスでスーパークラスのメソッドを再定義することができます。

ここではオーバーライドについて解説します。

  • オーバーライド

オーバーライドとは

オーバーライドはサブクラスでスーパークラスのメソッドを再定義することです。
スーパークラスのメソッドの意味合いは同じだけど、処理が異なる場合などに使用します。

基本構文

オーバーライドはスーパークラスのメソッドと同じ名前、同じ引数のメソッドをサブクラスで定義します。

class サブクラス名 extends スーパークラス名 {
    アクセス修飾子 function メソッド名( $引数名 ) {
        // 処理・・・・・・・
        return $変数名または値;
    }
}

サンプルコード

オーバーライドを使ったサンプルコードをご覧ください。

<?php

// クラス(サブクラス)
class Person {
    
    // 名前
    public $name = 'Watanabe You';
    
    // プロフィールを出力する
    public function profile() {
        echo "名前 : ".$this->name."\n";
    }
    
}

// クラス(スーパークラス)
class Teacher extends Person {
    
    // 担当科目
    public $subject = '体育';
    
    // 教師プロフィールを出力する
    public function profile() {
        echo $this->subject."教師 : ".$this->name."\n";
    }
    
}

// インスタンスの生成
$watanabe = new Teacher();

// プロフィールを出力
$watanabe->profile();

?>
体育教師 : Watanabe You

このコードの概要は次のようになります。

行数 内容
3〜14 Personクラスの定義。
16~27 Teacherクラスの定義(Personクラスを継承)。
30 Teacherクラスのインスタンスを生成し、$watanabeに代入。
33 $watanabeのprofileメソッドを呼び出し。

Personクラスでprofileメソッド定義しており、Teacherクラスでもprofileメソッドを定義しています。
このようにスーパークラスのメソッド(メソッド名・引数)と同じメソッドをサブクラスで定義することで、オーバーライドすることができます。

実行結果からTeacherクラスのメソッドが実行されていることが分かります。

演習問題

問題1

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

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

問題2

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

  • 下記表の3つのクラスを作成する
  • 実行結果になるように各クラスのインスタンスを使う
クラス 英記 継承元 フィールド メソッド
車クラス Car なし $distance(移動距離)
※ 初期値は0
$acceleration(加速度)
※ 初期値は60
display_distance()
→ $distanceの値を出力
run_distance()
→ 前進距離を計算
→ 計算式は$acceleration * 1.0
run()
→ run_distance()で前進距離を取得し出力する。また、$distanceに前進距離を加算
スポーツカークラス SportCar Car なし run_distance()
→ 前進距離を計算
→ 計算式は$acceleration * 1.2
ファミリーカークラス FamilyCar Car なし run_distance()
→ 前進距離を計算
→ 計算式は$acceleration * 0.8
===== 車       =====
60km進みます。
60km進みます。
移動距離 : 120km
===== スポーツカー  =====
72km進みます。
72km進みます。
移動距離 : 144km
===== ファミリーカー =====
48km進みます。
48km進みます。
移動距離 : 96km

まとめ

オーバーライドはサブクラスでスーパークラスのメソッドを再定義する方法です。
プログラミングでは暫し使われる方法なので、覚えていきましょう。