【PHP日記】

自分の知識不足を悟った末、なるべく1日一回、Webに関する知識を書いていくだけのブログ。

抽象クラスと抽象メソッド 【9日目】

今回は、PHPの大規模開発では欠かせない抽象クラス、抽象メソッドについてまとめてみます。


抽象クラス

抽象クラスは、それ自体ではインスタンスを作ることができない、継承を前提としたクラスのことで、子クラスで独自の定義をするというルールを強制したい場合に用いられます。


抽象クラスの宣言

抽象クラスはabstractキーワードを使用して宣言されます。

abstract class クラス名 {
}


主な特徴

抽象クラスの主な特徴や目的は以下の通りです。

  • 抽象クラスは抽象メソッド(Abstract Method)を持つことができます。抽象メソッドはメソッドの宣言だけを含み、実装は抽象クラスを継承した具象クラスで行います。

  • 抽象クラス自体は直接インスタンス化できません。具象クラスが抽象クラスを継承してインスタンス化する必要があります。


抽象メソッド

抽象クラスの目的の一つである「このメソッドを各クラスの中で直接定義しなければならない」というルールを設けるには抽象メソッドを使います。

abstract class クラス名 {
    abstract public function メソッド名;    // 抽象メソッド
}

メソッドの内容は各クラスで独自に設定するので、この時点で中身を書く必要はありません。

これができたら、あとは子クラス側で抽象クラスを継承することで、抽象メソッドの定義を強制させることができます。


コードの例

以下は、抽象クラスと抽象メソッドの例です。

abstract class BaseHello {
  protected $text;
  
  public function __construct($text) {
    $this->text = $text;
  }
  
  abstract public function show();
}

class Hello extends BaseHello{
  // ここの部分が強制される
  public function show() {
    printf('%s' , $this->text);
  }
}

class HelloWorld extends BaseHello{
  private $secondText;

  public function __construct($text, $secondText) {
    parent::__construct($text);
    $this->secondText = $secondText;
  }

  // ここの部分が強制される
  public function show() {
    printf('%s %s' , $this->text, $this->secondText);
  }
}

$hello = new HelloWorld('hello', 'world');

// 子クラスは、ベースとなる BaseHello 型を継承している
function helloShow(BaseHello $hello) {
  $hello->show();
}

helloShow($hello);

この例ではBaseHelloが抽象クラスであり、その中に抽象メソッドshowを定義しています。HelloクラスとHelloWorldクラスはそれぞれBaseHelloクラスを継承し、独自にshowメソッドを実装しています。

このように抽象クラスは、子クラス側でも定義を強制したい場合に有効的に使うことができます。


以上です。