抽象クラスと抽象メソッド – abstract

PHPには「インターフェイス」という、クラスの定義にルールを課す手法があります。しかし、インターフェイスには具体的な処理を記述する事ができないため、必ず子クラスですべての処理を記述しなければなりません。

そこで、通常のクラスの継承とインターフェイス、両方の性格を持ったものが「抽象クラス」です。

抽象クラスを作成する

次の例を見てみましょう。

abstract class Item {
  private $price;
  public function getPrice() {
    return $this->price;
  }
}

ここでは、Itemというクラスを定義しています。しかし、先頭に「abstract」というキーワードが付加されています。これが「抽象クラス」です。

抽象クラスには抽象メソッドを定義することができます。次のように追加しましょう。

abstract class Item {
  private $price;
  public function getPrice() {
    return $this->price;
  }

  // 単位を返す抽象メソッド
  abstract public function getUnit();
}

「getUnit」というメソッドを定義していますが、内容が定義されていません。そして、先頭には同じく「abstract」というキーワードが付加されています。これが抽象メソッドで、この「Item」クラスを継承したクラスは、必ずgetUnitメソッドを定義しなければなりません。次のように、単に継承しただけではエラーが発生します。

class Book extends Item {
    
}

Class Book contains 1 abstract method and must therefore be declared abstract or implement the remaining methods

そのため、次のように「getUnit」メソッドを実装します。

class Book extends Item {
    public function getUnit() {
        return '冊';
    }
}

インターフェイスと抽象クラスの違い

抽象クラスは、インターフェイスと違って実際のプロパティやメソッドを実装することもでき、もちろん子クラスはこれを継承することができます。

$book = new Book();
echo $book->getPrice();