【PHP】abstractとは? – 抽象クラスと抽象メソッドを定義する

PHPには抽象クラス・抽象メソッドと呼ばれる仕組みがあります。

それらはオブジェクト指向プログラミングで多々使われることがあります。

ここではabstractについて初心者向けに解説します。

★ 目的

  • 抽象クラス・抽象メソッドを理解する。
  • 抽象クラス・抽象メソッドを使えるようになる。

抽象クラスとは

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

そのクラス自体からインスタンスを生成することはできず、抽象メソッドを定義することができます。

抽象メソッドとは

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

その定義ではメソッド名・引数のみを定義し、処理は記述しません。

抽象化

抽象化とはオブジェクト指向プログラミングや設計時にも使われる言葉ですが、プログラミングでは抽象クラスや抽象メソッドを定義することと覚えておきましょう。

基本構文

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

// 抽象クラス
abstract class クラス名 {
    
    // 抽象メソッド
    abstract アクセス修飾子 function メソッド名();
    
}

通常のクラス・メソッドの定義で先頭に『abstract』を付けると抽象クラス・抽象メソッドを定義できます。

サンプルコード

次のサンプルコードで理解を深めましょう。

ソースコード

<?php

// 抽象クラス
abstract class Person {
    
    // 名前
    public $name = 'Watanabe You';
    
    // プロフィールを出力する
    abstract protected function profile();
    
}

// クラス(抽象クラスを継承)
class Teacher extends Person {
    
    // 担当科目
    public $subject = '体育';
    
    // 教師プロフィールを出力する
    public function profile() {
        echo $this->subject."教師 : ".$this->name."\n";
    }
    
}

$watanabe = new Teacher();
$watanabe->profile();

?>

実行結果

体育教師 : Watanabe You

抽象クラスのPersonを定義し、Teacherクラスで継承しています。

各コードの概要は次をご参考ください。

行数概要
4行目〜12行目Personクラス(抽象クラス)の定義。
15行目〜25行目Teacherクラス(Personクラスを継承)の定義。
27行目Teacherクラスのインスタンスを生成し、$watanabeに代入。
28行目$watanabeのprofileメソッドを呼び出し。

Personクラスとそのprofileメソッドをabstractで抽象化しています。

抽象化することで、Personクラスに抽象メソッドを定義できるようになり、インスタンスを生成することができなくなります。また、抽象メソッド(ここではprofileメソッド)は処理の定義を必要としなくなります。

Teacherクラスは通常のクラスを継承するのと同じように記述できます。

実行結果から正常にプログラムが動作していることが分かります。

注意点

抽象クラスを継承したクラスは抽象メソッドを必ずオーバーライドで実装する必要があります。

また、抽象メソッドはオーバーライドを前提として定義するため、アクセス修飾子にprivateを使うことはできません。

実装時は注意して使いましょう。

まとめ

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

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