【PHP】抽象クラス(abstract) - 継承を前提としたクラス
PHPには抽象クラスと呼ぶ、継承を前提としたクラスがあります。
ここでは、抽象クラスについて解説します。
検証環境
抽象クラス
抽象クラスは“継承(されること)を前提としたクラス”です。
通常のクラスを『具象クラス』と呼びますが、抽象クラスは名前のとおり、具象クラスに比べ抽象度が高い(概念寄りな)クラスになります。
オブジェクトを生成できず、具象クラスで継承して活用します。
一般的にプログラム設計などでクラスの仕様を明確にするために使用し、複数人の開発で実装レベルのルールを作る役割を担います。
基本構文
abstract class クラス名 {
// クラス定数・クラス変数・クラスメソッド
// フィールド・メソッド
}
具象クラスの定義と基本的には同じですが、class
の前にabstract
を記述します。
抽象クラスは具象クラスと同様にクラス定数やクラス変数、クラスメソッド、フィールド、メソッド等を定義することが可能です。
サンプル
<?php
// 人間クラス
___ih_hl_start
abstract class Person {
// 名前
public $name;
// コンストラクタ
public function __construct( $name ) {
$this->name = $name;
}
}
___ih_hl_end
// 教師クラス
class Teacher extends Person {
// 担当科目
public $subject;
// コンストラクタ
public function __construct( $name, $subject ) {
parent::__construct($name);
$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.
4〜14行目が抽象クラスであるPerson
クラスの定義です。
Teacher
クラスはPerson
クラスを継承し、定義を引き継いでいます。
36〜37行目でオブジェクトを生成し、メソッドを呼び出していますが、実行結果から正常に処理できたことが分かります。
もし、抽象クラスのPerson
クラスからオブジェクトを生成しようとし、new Person()
と記述するとエラーが発生するので注意しましょう。
演習問題
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 下記表の3つのクラスを作成する
- 実行結果になるように各クラスのインスタンスを使う
クラス | 英記 | 継承元 | フィールド | メソッド |
---|---|---|---|---|
乗り物クラス
(抽象クラス) |
Vehicle |
なし | ・$distance (移動距離)
※ 初期値は0 |
・move()
→ "移動します。" を出力し、$distance の値を20加算する。
・ display_distance()
→ $distance の値を出力 |
車クラス | Car |
Vehicle |
なし | ・run()
→ "走行します。" を出力し、$distance の値を50加算する。 |
飛行機クラス | Airplane |
Vehicle |
なし | ・fly()
→ "飛行します。" を出力し、$distance の値を50加算する。 |
===== 車クラス =====
走行します。
走行します。
移動距離 : 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円