Developer

【PHP応用】 抽象クラス
2021.07.31
Lv1

【PHP応用】 抽象クラス

【PHP応用】 抽象クラス

この記事では、抽象クラスと抽象メソッドを解説し、
両者の構文を例示します。

1.抽象クラスは「abstract」キーワードを使って定義する。
2.抽象メソッドを含むクラスは抽象クラスにする必要がある。
3.抽象クラスを継承する具象クラスは、抽象メソッドを実装する必要がある。

抽象クラス・抽象メソッドとは

これまで作成してきたクラスのように
インスタンス化をしてオブジェクトを生成できるクラスを
具象クラス」といいます。
一方で、インスタンスを生成できないクラスを「抽象クラス」といいます。

抽象クラスは、複数の具象クラスが中身の処理(実装)が異なるが、
名前や引数や戻り値(外観)が同じメソッドを持っている時、
それらのクラスに共通の親クラスを定義するときに用います。

例えば、「showMessage」というメソッドを持つクラスが3つあったとき、
1つ目のクラスは「おはよう」、
2つ目のクラスは「こんにちは」、
3つめのクラスは「こんばんは」を表示するとします。
このとき、この3つのクラスの親クラスとして抽象クラスを定義すると、
「showMessage」というメソッドを持っているには持っているが、
中身でどういう処理をするかは定義していないという状態になります。
このような、外観があるが実装がされていないメソッドを
「抽象メソッド」と言い、
抽象メソッドが1つ以上あるクラスは
抽象クラスとして定義する必要があります。

抽象クラスから継承して子クラスを定義する際、親クラス(抽象クラス) の抽象メソッドは、
子クラスで定義(実装)される必要があります。
また、そのメソッドはvisibility(可視性)が同じかそれ以上である必要があります。

抽象クラス・抽象メソッドの構文

具象クラスと違い、「abstract」というキーワードを使っています。

abstract class クラス{
    abstract function メソッド名();
}

実例


<?php
    
abstract class Sample2_2_1{
    public abstract function showMessage();
}
class Concrete1 extends Sample2_2_1{
    public function showMessage(){
        echo "おはよう";
    }
}
class Concrete2 extends Sample2_2_1{
    public function showMessage(){
        echo "こんにちは";
    }
}

echo "Concrete1 : ";
$c1 = new Concrete1;
$c1->showMessage();
echo "</br>";

echo "Concrete2 : ";
$c2 = new Concrete2;
$c2->showMessage();
echo "</br>";
?>

抽象クラスでの具象メソッドの定義

抽象クラスでも、具象メソッドを定義できます。
しかし、newして、インスタンス化することができないので、
そのままの形で用いることはできません。
必ず、継承先の子クラスを用意する必要があります。

<?php

abstract class AbstractClass{
    abstract function x();
    
    function y(){
        echo "y";
    }
}

$absClass = new AbstractClass();
$absClass->y();
?>