PHPの抽象クラス(アブストラクトクラス)

抽象クラス(アブストラクトクラス)とは、継承されることを前提に定義する抽象的なクラスです。抽象クラスをうまく利用することにより、複数人で作業する際の仕様の統一、効率的な設計、メンテナンス性の向上など様々なメリットが生まれます。

抽象クラス(アブストラクトクラス)の定義

抽象クラスは、単体でインスタンス化することはできません。必ず抽象クラスを継承したクラスを定義し、そのクラスをインスタンス化します。抽象クラスは、classキーワードの前にabstractキーワードを付けて定義します。抽象クラスでも、通常のクラスと同じようにプロパティやメソッドを定義して、サブクラスから利用することができます。

PHP

<?php
abstract class AbstractFoo
{
  protected $name = 'AbstractFoo';
  public function echoName()
  {
    echo $this->name, PHP_EOL;
  }
}
class Foo extends AbstractFoo
{
}
/* 出力:Fatal error: Cannot instantiate abstract class
$abstractFoo = new AbstractFoo();
*/
$foo = new Foo();
$foo->echoName(); // 出力:AbstractFoo
?>

抽象メソッド(アブストラクトメソッド)

抽象クラスの一番の特徴は、抽象メソッド(アブストラクトメソッド)を定義できる点です。抽象メソッドとは、サブクラスでの実装を義務づけることができるメソッドです。抽象メソッドは、先頭にabstractキーワードを付け、実装は記述せずに宣言のみを行います。

そして継承するサブクラスでは、必ず抽象メソッドを実装する必要があります。その際に引数を同じにする必要がありますが、デフォルト値を持つ引数を追加することは許容されます。また、アクセス修飾子も同じか緩く(protectedの場合はprotectedかpublic)する必要があります。

PHP

<?php
abstract class AbstractHoge
{
  protected $name = 'AbstractHoge';
  public function echoName()
  {
    echo $this->name, PHP_EOL;
  }
  abstract public function sayHello($greeting);
}
class Hoge extends AbstractHoge
{
  public function __construct($name)
  {
    $this->name = $name;
  }
  public function sayHello($greeting, $target = 'japan')
  {
    echo $greeting . ' ' . $target . '.', PHP_EOL;
  }
}
$hoge = new Hoge('Hoge');
$hoge->echoName(); // 出力:Hoge
$hoge->sayHello('Hello', 'world'); // 出力:Hello world.
?>
  • このエントリーをはてなブックマークに追加

Advertisement