PHP abstract(抽象クラス)について 【初級編 第48回】

この記事は2013年1月23日に書かれたものです。内容が古い可能性がありますのでご注意ください。


PHP abstract(抽象クラス)

クラス

前回に引き続いて今回もクラスについて記述していきたいと思います。

抽象クラス

抽象クラスとはインスタンス化はできないクラスを指します。
自身をインスタンス化することはできないので継承をする前提で定義するものになります。
前回やったインターフェイスのように抽象クラスにメソッドの存在を定義して派生クラス側で処理の内容を定義するという使い方になります。
ただインターフェイスと異なるのは抽象クラスでは自身の中で通常のメソッドを定義して内容を定義できるという点です。
ちなみに抽象クラス内に宣言だけして、処理の内容を定義しないものは抽象メソッドと呼ばれます。

抽象クラスであらかじめ宣言だけすることでそれを継承する各派生クラスで処理の内容を変えたいといった使い方ができます。
あらかじめ宣言だけしておいて処理の内容を後に定義するということでクラスの設計などをする際に使用されます。
またその抽象メソッドを使用することで、その抽象メソッドに関する処理が必ず派生クラスに存在するといったことが分かります。

抽象クラスの記述方法

抽象クラスや抽象メソッドは以下のように abstract を付けて宣言します。
abstract を付けたクラスは抽象クラスになります。
また funciton の前に abstract を付けたものは抽象メソッドです。

抽象メソッドを定義した場合は必ずクラスも抽象クラスにしなければならずもし abstract が付いていないとエラーになります。
またインターフェイスのように抽象メソッドを継承した派生クラス内では抽象メソッドの処理を全て定義しなければならずこれもエラーになります。

abstract class 抽象クラス名{
  abstract public function 抽象メソッド名1();
  abstract public function 抽象メソッド名2();
}

class クラス名 extends 抽象クラス名{
  public function 抽象メソッド名1(){
    処理内容;
  }
  public function 抽象メソッド名1(){
    処理内容;
  }
}

抽象クラスの記述例

以下では抽象クラスに定義した抽象メソッドの処理を継承した派生クラス内で定義しています。

<?php

  abstract class absclass{
    abstract public function func1();
    abstract public function func2();
  }

  class class1 extends absclass{
    public function func1(){
      echo "in func1<br>";
    }
    public function func2(){
      echo "in func2<br>";
    }
  }

  $obj = new class1;
  $obj->func1();
  $obj->func2();

?>

結果は以下のようになります。
ブラウザ確認画像

以下のように abstract で抽象化されているメソッドがある場合はクラスも抽象化しなければいけません。

<?php

  class absclass{
    abstract public function func1();
    abstract public function func2();
  }

?>

結果は以下のようになります。
ブラウザ確認画像

また以下のように抽象クラスで定義している抽象メソッドが継承した派生クラスで記述されていないとエラーになります。

<?php

  abstract class absclass{
    abstract public function func1();
    abstract public function func2();
  }

  class class1 extends absclass{
     public function func2(){
      echo "in func2<br>";
    }
  }

  $obj = new class1;
  $obj->func2();

?>

結果は以下のようになります。
ブラウザ確認画像

抽象クラス内には抽象メソッド以外に通常のメソッドを定義して処理の内容を記述することもできます。
この場合は継承した派生クラス内でそのメソッドをオーバーライドする必要はありません。

<?php

  abstract class absclass{
    abstract public function func1();
    abstract public function func2();
    public function func3(){
      echo "in func3<br>";
    }
  }

  class class1 extends absclass{
    public function func1(){
      echo "in func1<br>";
    }
    public function func2(){
      echo "in func2<br>";
    }
  }

  $obj = new class1;
  $obj->func1();
  $obj->func2();
  absclass::func3();

?>

この場合の結果は以下のようになります。
ブラウザ確認画像

今回は抽象クラスは派生クラスの名前やメソッドの名前などを適当に書きましたが
本来抽象クラスと派生クラスの名前やメソッドは意味のある分かりやすい名前にすることが大切です。

今回はここまでにします。

  • このエントリーをはてなブックマークに追加

PAGE TOP