PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの抽象クラス(abstract class)とは?基本から継承時のルールまで解説

はじめに

オブジェクト指向プログラミングにおける抽象クラス(abstract class)とは、インスタンス化できないクラスのことです。つまり、抽象クラスから直接オブジェクトを生成することはできません。PHPではバージョン5.0以降、抽象クラスの概念がサポートされています。

クラス定義にabstractキーワードを付けると、そのクラスは抽象クラスになります。また、少なくとも1つでも抽象メソッドを含むクラスも、自動的に抽象クラスとして扱われます。

構文

<?php
abstract class testclass{
    //
}
?>

このクラスのオブジェクトを生成しようとすると、PHPパーサーは次のようなエラーをスローします。

$a=new testclass();
PHP Fatal error: Uncaught Error: Cannot instantiate abstract class testclass

抽象メソッドとは

抽象メソッドは、シグネチャ(可視性・引数・型宣言などの情報)のみを宣言し、処理の本体となる機能を持ちません。抽象クラスを継承した子クラスは、親クラスが持つすべての抽象メソッドを必ずオーバーライド(具体的な定義を提供)しなければなりません。子クラス側のメソッドは、親クラスと同じシグネチャを持つ必要があり、この条件が満たされない場合、PHPパーサーはエラーをスローします。

抽象クラスを継承し、すべての抽象メソッドを実装したクラスは、インスタンス化できるようになります。このようなクラスは「具象クラス(concrete class)」と呼ばれます。

例:未実装の抽象メソッドがある場合

次の例では、親クラスに2つの抽象メソッドが定義されていますが、子クラスで実装されているのは1つだけです。この場合、以下のようなエラーが発生します。

<?php
abstract class testclass{
    abstract function test1();
    abstract function hello();
}
class myclass extends testclass{
    function test1(){
        echo "Overrides parent test method";
    }
}
$a=new myclass();
?>

出力

表示されるエラーメッセージは次の通りです。

PHP Fatal error: Class myclass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (testclass::hello)

引数を持つ抽象メソッド

抽象メソッドに引数が定義されている場合は、子クラスでオーバーライドする際にも、同じ数の引数を指定する必要があります。

次の例では、親クラスの抽象メソッドが2つの引数を持っており、子クラスでも同じく2つの引数を持つ同名のメソッドを定義しています。

<?php
abstract class testclass{
    abstract function hello($name, $age);
}
class myclass extends testclass{
    function hello($name, $age){
        echo "My name is $name and my age is $age";
    }
}
$a=new myclass();
$a->hello("Ravi",20);
?>

出力

このコードを実行すると、次の出力が得られます。

My name is Ravi and my age is 20

まとめ

抽象クラスは、共通のインターフェースを強制しながら実装の詳細を子クラスに委ねるための強力な仕組みです。押さえておきたいポイントは以下の通りです。

  • abstractキーワードを付けたクラス、または抽象メソッドを1つ以上含むクラスは抽象クラスになる
  • 抽象クラスは直接インスタンス化できない
  • 抽象メソッドはシグネチャのみを宣言し、処理の本体を持たない
  • 子クラスはすべての抽象メソッドを同じシグネチャでオーバーライドする必要がある
  • すべての抽象メソッドを実装した子クラス(具象クラス)のみがインスタンス化できる
  1. C#の抽象化とは?抽象クラスの基本と実装例をわかりやすく解説

    抽象化(Abstraction)とカプセル化(Encapsulation)は、オブジェクト指向プログラミングにおいて密接に関連する概念です。抽象化は必要な情報だけを外部に見せることを可能にし、カプセル化はプログラマーがその抽象化のレベルを自由に実装できるようにする仕組みです。 抽象化とは何か 抽象化とは、オブジェクトの本質的な特徴や振る舞いだけを取り出し、不要な詳細を隠すことで、複雑なシステムをシンプルに扱えるようにする考え方です。たとえば「図形」という抽象的な概念に対して「面積を計算できる」という共通の操作だけを定義し、実際の計算方法は各図形(長方形・円など)に任せる、といった柔軟な設計が可

  2. Javaの抽象クラスとは?基本ルールと実装例をわかりやすく解説

    Javaの抽象クラスとは宣言に「abstract」キーワードを含むクラスは、抽象クラスと呼ばれます。抽象クラスは、継承によって利用されることを前提とした設計用のクラスであり、オブジェクト指向プログラミングにおける重要な概念の一つです。抽象クラスの主な特徴抽象クラスには、抽象メソッド(本体を持たないメソッド。例:public void get();)が含まれる場合もあれば、含まれない場合もあります。ただし、クラス内に1つでも抽象メソッドが存在する場合、そのクラスは必ず abstract として宣言しなければなりません。abstract として宣言されたクラスは、インスタンス化(newによるオブジ