ITHACK
~ みんなのIT部門 ~

【PHP】抽象クラス(abstract) – 継承を前提としたクラス

PHPには抽象クラスと呼ばれる仕組みがあります。
抽象クラスは継承を前提としたクラスで、オブジェクト指向プログラミングで使うことがあります。

ここでは抽象クラスについて解説します。

  • 抽象クラス

抽象クラスとは

抽象クラスは継承されることを前提としたクラスです。
直接インスタンスを生成することはできません。

また、抽象クラスに対して、インスタンスを生成できるクラスを具象クラスと呼びます。

基本構文

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

abstract class クラス名 {
    // クラス定数・クラス変数・クラスメソッド
    // フィールド・メソッド
}

クラス定義のclassの前にabstractを付けることで抽象クラスとなります。
抽象クラスは具象クラスと同様にクラス定数やクラス変数、クラスメソッド、フィールド、メソッドを定義することができます。

サンプルコード

抽象クラスを使用したサンプルコードをご覧ください。

<?php

abstract class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
}

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

抽象クラスであるPersonクラスを定義し、Teacherクラスで継承しています。
Teacherクラスからインスタンスの生成ができるため、28行目以降でインスタンス生成やメソッドの呼び出しをおこなっています。

もし、Personクラスからインスタンスを生成しようとして、new Person()と記述するとエラーになるので注意しましょう。

演習問題

問題1

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

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

まとめ

抽象クラスは継承されることを前提としたクラスです。

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