ITHACK
~ みんなのIT部門 ~

【PHP】クラスの継承(extends) – クラスの拡張

クラスには継承と呼ばれる仕組みがあります。
継承を使うことで既存クラスの定義を引き継いだ新しいクラスを定義することができます。

ここではクラスの継承について解説します。

なお、クラスについては次の記事をご覧ください。

  • クラスの継承

クラスの継承とは

クラスの継承は、既存クラスの定義を引き継いで新しいクラスを定義することです。
引き継ぐと既存クラスのフィールドやメソッド等を新しいクラスでも使えるようになります。

スーパークラス・サブクラス

継承では、継承元(引き継がれるクラス)をスーパークラス継承先(引き継ぐクラス)をサブクラスと呼びます。
※ スーパークラスを親クラス、サブクラスを子クラスと呼ぶこともあります。

基本構文

クラス継承の基本構文は次のようになります。

class サブクラス名 extends スーパークラス名 {

}

extendsキーワードに続いてスーパークラスを記述します。

サンプルコード

クラス継承を使ったサンプルコードをご覧ください。

<?php

// クラス
class Person {
    
    // 名前
    public $name;
    
    // コンストラクタ
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
    }
    
}

// クラス
class Teacher extends Person {
    
}

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

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

?>
===== プロフィール =====
名前 : Watanabe You

Personクラスを継承したTeacherクラスを定義し、Teacherクラスのインスタンスからprofileメソッドを呼び出しています。

Teacherクラスにフィールドやメソッドは何も定義されていませんが、実行結果からprofileメソッドが使えていることが分かります。

これはPersonクラスを継承したことにより、PersonクラスのフィールドやメソッドがTeacherクラスで使えるようになったということです。

そして、サブクラスであるTeacherクラスに独自のフィールドやメソッドを追加することもできます。

<?php

// クラス
class Person {
    
    // 名前
    public $name;
    
    // コンストラクタ
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
    }
    
}

// クラス
class Teacher extends Person {
    
    // 担当科目
    public $subject = '体育';
    
    // 担当科目を出力する
    public function display_subject() {
        echo "担当科目 : ".$this->subject."\n";
    }
    
}

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

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

?>
===== プロフィール =====
名前 : Watanabe You
担当科目 : 体育

先ほどのサンプルコードに次の点を追加しました。

行数 概要
26 担当科目フィールドの$subjectを追加
29~31 担当科目を出力するdisplay_subjectメソッドを追加
40 Teacherクラスのインスタンスからdisplay_subjectメソッドを呼び出し

実行結果から分かる通り、問題なく動作しています。

このように、継承では既存クラスを引き継ぎ、新しくフィールドやメソッドを追加することで拡張したクラスを定義することが可能になります。

演習問題

問題1

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

  • 下記表の3つのクラスを作成する
  • 実行結果になるように各クラスのインスタンスを使う
クラス 英記 継承元 フィールド メソッド
乗り物クラス Vehicle なし $distance(移動距離)
※ 初期値は0
move()
→ "移動します。"を出力し、$distanceの値を20加算する。
display_distance()
→ $distanceの値を出力
車クラス Car Vehicle なし run()
→ "走行します。"を出力し、$distanceの値を50加算する。
飛行機クラス Airplane Vehicle なし fly()
→ "飛行します。"を出力し、$distanceの値を50加算する。
===== 乗り物クラスのインスタンス =====
移動します。
移動距離 : 20km
=====  車クラスのインスタンス  =====
走行します。
走行します。
移動距離 : 100km
===== 飛行機クラスのインスタンス =====
飛行します。
飛行します。
飛行します。
移動距離 : 2400km

問題2

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

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

まとめ

クラス継承は既存クラスを拡張する方法です。
アプリ設計や開発スピード、コードの柔軟性等、使えると強力な方法となりますので、覚えていきましょう。