ITHACK
~ みんなのIT部門 ~

【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を使うことができませんので注意しましょう。

演習問題

問題1

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

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

問題2

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

  • 下記表の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

まとめ

抽象メソッドはオーバーライドされることを前提としたメソッドです。

メリットやデメリットを理解するには設計やオブジェクト指向プログラミングと呼ばれる考え方の知識が必要となりますが、先ずはプログラミング上での使い方を覚えていきましょう。