
【PHP】抽象メソッド(abstract) – オーバーライドを前提としたメソッド
PHPには抽象メソッドと呼ばれる仕組みがあります。
抽象メソッドはオーバーライドされることを前提としたメソッドです。
ここでは抽象メソッドについて解説します。
-
抽象メソッド
抽象メソッドとは
抽象メソッドはオーバーライドされることを前提としたメソッドです。
抽象クラスでのみ使うことができ、メソッド名や引数のみを定義します。
また、オーバーライドされることを前提としているため、ブロック({}
)を持つことができません。
基本構文
抽象メソッドの基本構文は次のようになります。
abstract class クラス名 {
abstract アクセス修飾子 function メソッド名( $引数名 );
}
抽象メソッドは基本的には通常のメソッドと同様ですが、先頭にabstract
を付け、ブロック({}
)は記述しません。
サンプルコード
抽象メソッドを使ったサンプルコードをご覧ください。
<?php
abstract class Person {
public $name;
public function __construct( $name ) {
$this->name = $name;
}
abstract public function profile();
}
class Teacher extends Person {
public $subject;
public function __construct( $name, $subject ) {
parent::__construct($name);
$this->subject = $subject;
}
public function profile() {
echo $this->subject."教師 : ".$this->name."\n";
}
}
$watanabe = new Teacher('Watanabe You', '体育');
$watanabe->profile();
?>
体育教師 : Watanabe You
11行目で抽象メソッドを定義しています。
このようにすることでPersonクラスを継承したTeacherクラスでは必ずprofileメソッドをオーバーライドする必要があります。
なお、抽象クラスを継承した抽象クラスでは、抽象メソッドをオーバーライドする必要はありません。継承したクラスが具象クラスの場合のみ、オーバーライドが必須となります。
注意点
抽象メソッドはオーバーライドされることを前提としているため、アクセス修飾子にprivateを使うことができませんので注意しましょう。
演習問題
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 下記表の3つのクラスを作成する
- 実行結果になるように各クラスのインスタンスを使う
クラス | 英記 | 継承元 | フィールド | メソッド |
---|---|---|---|---|
チケットクラス
(抽象クラス) |
Ticket |
なし | ・$price (料金) |
・info()
→ 抽象メソッド |
ライブチケット | LiveTicket |
Ticket |
・$place (場所) |
・info()
→ 場所と料金を出力 |
ライブ配信チケット | LiveStreamingTicket |
Ticket |
・$url (URL) |
・info()
→ URLと料金を出力 |
===== ライブチケット =====
料金 : 8000円
場所 : ライブハウス
===== ライブ配信 =====
料金 : 3000円
URL : https://it-hack.net/live-streaming
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 下記表の3つのクラスを作成する
- 実行結果になるように各クラスのインスタンスを使う
クラス | 英記 | 継承元 | フィールド | メソッド |
---|---|---|---|---|
車クラス
(抽象クラス) |
Car |
なし | ・$distance (移動距離)
※ 初期値は0 ・ $acceleration (加速度)
※ 初期値は60 |
・display_distance()
→ $distance の値を出力
・ run_distance()
→ 抽象メソッド ・ run()
→ run_distance() で前進距離を取得し出力する。また、$distanceに前進距離を加算 |
スポーツカークラス | SportCar |
Car |
なし | ・run_distance()
→ 前進距離を計算 → 計算式は $acceleration * 1.2 |
ファミリーカークラス | FamilyCar |
Car |
なし | ・run_distance()
→ 前進距離を計算 → 計算式は $acceleration * 0.8 |
===== スポーツカー =====
72km進みます。
72km進みます。
移動距離 : 144km
===== ファミリーカー =====
48km進みます。
48km進みます。
移動距離 : 96km
まとめ
抽象メソッドはオーバーライドされることを前提としたメソッドです。
メリットやデメリットを理解するには設計やオブジェクト指向プログラミングと呼ばれる考え方の知識が必要となりますが、先ずはプログラミング上での使い方を覚えていきましょう。