
【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 メソッドを呼び出し |
実行結果から分かる通り、問題なく動作しています。
このように、継承では既存クラスを引き継ぎ、新しくフィールドやメソッドを追加することで拡張したクラスを定義することが可能になります。
演習問題
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 下記表の3つのクラスを作成する
- 実行結果になるように各クラスのインスタンスを使う
クラス | 英記 | 継承元 | フィールド | メソッド |
---|---|---|---|---|
乗り物クラス | Vehicle |
なし | ・$distance (移動距離)
※ 初期値は0 |
・move()
→ "移動します。" を出力し、$distance の値を20加算する。
・ display_distance()
→ $distance の値を出力 |
車クラス | Car |
Vehicle |
なし | ・run()
→ "走行します。" を出力し、$distance の値を50加算する。 |
飛行機クラス | Airplane |
Vehicle |
なし | ・fly()
→ "飛行します。" を出力し、$distance の値を50加算する。 |
===== 乗り物クラスのインスタンス =====
移動します。
移動距離 : 20km
===== 車クラスのインスタンス =====
走行します。
走行します。
移動距離 : 100km
===== 飛行機クラスのインスタンス =====
飛行します。
飛行します。
飛行します。
移動距離 : 2400km
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 下記表の3つのクラスを作成する
- 実行結果になるように各クラスのインスタンスを使う
クラス | 英記 | 継承元 | フィールド | メソッド |
---|---|---|---|---|
チケットクラス | Ticket |
なし | ・$price (料金) |
・display_price()
→ $ の値を出力 |
ライブチケット | LiveTicket |
Ticket |
・$place (場所) |
・info()
→ 場所と料金を出力 ※ 料金の出力は display_price() を使う |
ライブ配信チケット | LiveStreamingTicket |
Ticket |
・$url (URL) |
・info()
→ URLと料金を出力 ※ 料金の出力は display_price() を使う |
===== ライブチケットクラスのインスタンス =====
場所 : ライブハウス
料金 : 8000円
===== ライブ配信クラスのインスタンス =====
URL : https://it-hack.net/live-streaming
料金 : 3000円
まとめ
クラス継承は既存クラスを拡張する方法です。
アプリ設計や開発スピード、コードの柔軟性等、使えると強力な方法となりますので、覚えていきましょう。