この記事では主に PHP の抽象クラスとインターフェイスについて詳しく説明します。お役に立てれば幸いです。
1. 抽象クラス抽象クラス
1.抽象クラスとは、クラスと抽象メソッド(クラスメソッドの関数キーワードの前に抽象キーワード)の前に抽象キーワードを追加したクラスを指します。
2.抽象クラスは直接インスタンス化できません。抽象クラスは、サブクラスに必要なメソッドのみを定義 (または部分的に実装) します。サブクラスは、抽象クラスを継承し、抽象クラス内のすべての抽象メソッドを実装することによって、抽象クラスを具体化できます。
3.サブクラスをインスタンス化する必要がある場合は、抽象クラス内のすべての抽象メソッドを実装する必要があります。サブクラスが抽象クラス内のすべての抽象メソッドを実装していない場合、そのサブクラスも抽象クラスであり、クラス内でその前に abstract キーワードを付ける必要があり、インスタンス化できません。
りぃ4.以下に示すように、A を継承するサブクラス B を作成するが、抽象メソッド abstract_func():
abstract class A { /** 抽象类中可以定义变量 */ protected $value1 = 0; private $value2 = 1; public $value3 = 2; /** 也可以定义非抽象方法 */ public function my_print() { echo "hello,world/n"; } /** * 大多数情况下,抽象类至少含有一个抽象方法。抽象方法用abstract关键字声明,其中不能有具体内容。 * 可以像声明普通类方法那样声明抽象方法,但是要以分号而不是方法体结束。也就是说抽象方法在抽象类中不能被实现,也就是没有函数体“{some codes}”。 */ abstract protected function abstract_func1(); abstract protected function abstract_func2(); } abstract class B extends A { public function abstract_func1() { echo "implement the abstract_func1 in class A/n"; } /** 这么写在zend studio 8中会报错*/ //abstract protected function abstract_func2(); } class C extends B { public function abstract_func2() { echo "implement the abstract_func2 in class A/n"; } }
を実装していない場合、プログラムには次のエラーが発生します:
Class B extends A{};
5。 B が抽象メソッド abstract_func() を実装する場合、B の abstract_func() メソッドのアクセス制御は、A の abstract_func() のアクセス制御よりも厳密にすることはできません。つまり、
(1) If abstract_func() A の abstract_func() が public として宣言されている場合、B の abstract_func() の宣言は public のみにすることができ、 protected または private にすることはできません
(2) A の abstract_func() が protected と宣言されている場合、B の abstract_func() の宣言は次のようにできます。 public または protected にすることはできますが、private にすることはできません
(3) A の abstract_func() が private として宣言されている場合、プライベートとして定義することはできません。 (致命的なエラー: 抽象関数 A::abstract_func() は private として宣言できません)
2. インターフェースインターフェース
1.抽象クラスは具体的な実装の標準を提供しますが、インターフェイスは純粋なテンプレートです。インターフェイスは関数のみを定義し、実装内容は定義しません。インターフェースはキーワードinterfaceで宣言されます。
2.インターフェイスは完全に抽象的であり、メソッドとパブリック メソッドのみを宣言でき、メソッド本体を定義できず、インスタンス変数も宣言できません。ただし、インターフェイスでは定数変数を宣言できます。しかし、インターフェイスに定数変数を配置することは、インターフェイスとしての存在目的に違反し、インターフェイスとクラスの異なる値を混乱させます。本当に必要な場合は、対応する抽象クラスまたはクラスに配置できます。
りぃ3.インターフェイスを実装するクラスは、インターフェイス
Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::abstract_func)
で定義されているすべてのメソッドを実装する必要があります。それ以外の場合、クラスは abstract と宣言する必要があります。
4.クラスは、宣言内でimplements キーワードを使用してインターフェイスを実装できます。これを実行した後、インターフェイスを実装する具体的なプロセスは、抽象メソッドのみを含む抽象クラスを継承するのと同じになります。クラスは親クラスを継承し、同時に任意の数のインターフェイスを実装できます。 extends 句は、implements 句の前に置く必要があります。 PHP は 1 つの親クラスからの継承のみをサポートするため、extends キーワードの後にはクラス名のみを指定できます。
5.インターフェイスは別のインターフェイスを実装できませんが、複数の
interface iA { const AVAR=3; public function iAfunc1(); public function iAfunc2(); } echo iA:: AVAR;
3. 抽象クラスとインターフェイスの類似点と相違点
1. 類似点:
(1) どちらも抽象クラスであり、どちらもインスタンス化できません。 。
(2) インターフェース実装クラスおよび抽象クラスのサブクラスは、宣言された抽象メソッドを実装する必要があります。
2. 違い:
(1) インターフェースは、implements を使用して実装する必要がありますが、抽象クラスは extends を使用して継承する必要があります。
(2) クラスは複数のインターフェースを実装できますが、継承できる抽象クラスは 1 つだけです。
(3) インターフェースは特定の機能の実装を重視し、抽象クラスは所有関係を重視します。
(4) インターフェース実装クラスと抽象クラスのサブクラスは、対応する抽象メソッドを実装する必要がありますが、実装形式が異なります。インターフェイス内のすべてのメソッドは抽象メソッドであり、宣言のみが行われ (宣言、メソッド本体はありません)、実装クラスはそれを実装する必要があります。抽象クラスのサブクラスは選択的に実装できます。この選択には次の 2 つの意味があります。 a) 抽象クラス内のすべてのメソッドが抽象であるわけではありません。抽象を持つメソッドだけが抽象であるため、サブクラスによって実装する必要があります。抽象を持たないメソッドの場合、メソッド本体は抽象クラスで定義する必要があります。b) 抽象クラスのサブクラスがそれを継承する場合、非抽象メソッドを直接継承またはオーバーライドすることができ、実装することもできます。サブクラスに任せることができますが、このクラスも抽象として宣言する必要があります。抽象クラスなので当然インスタンス化できません。
(5) 抽象クラスはインターフェイスとクラスの間の仲介者です。抽象クラスはインターフェイスとクラスを接続する役割を果たします。一方では、抽象クラスは抽象的であり、サブクラスが実装する必要がある関数を標準化するために抽象メソッドを宣言できます。他方では、サブクラスによって直接使用またはオーバーライドされるデフォルトのメソッド本体を定義できます。さらに、継承を通じてサブクラスで使用する独自のインスタンス変数を定義できます。
(6) インターフェース内の抽象メソッドの前に抽象キーワードを追加することはできません。抽象メソッドはデフォルトで暗黙的であり、抽象メソッドの継承を防ぐためにfinalキーワードを追加することはできません。抽象クラスでは、抽象メソッドとして明示的に宣言されていることを示すために、抽象メソッドの前に abstract を追加する必要があります。
(7) インターフェイスの抽象メソッドはデフォルトでパブリックであり、プライベート修飾子または保護された修飾子を使用してのみ変更できます。抽象クラスの抽象メソッドは、public および protected で変更できますが、private で変更することはできません。
3. インターフェースの応用シナリオ
(1) クラスは、実装方法に関係なく、調整のために特定のインターフェースを必要とします。
(2) 特定の機能を実装できる識別子として存在することも、インターフェイス メソッドを持たない純粋な識別子であることもできます。
(3) クラスのグループを単一のクラスとして扱う必要があり、呼び出し元はインターフェイスを通じてこのクラスのグループにのみ連絡します。
(4) 複数の特定の機能を実装する必要があり、それらの機能はまったく関連していない可能性があります。
4. 抽象クラスの適用場面
つまり、統一されたインターフェースとインスタンス変数またはデフォルトメソッドの両方が必要な場合に使用できます。最も一般的なものは次のとおりです:
(1) インターフェイスのセットを定義しますが、各実装クラスにすべてのインターフェイスの実装を強制したくありません。抽象クラスを使用してメソッド本体のセット、または空のメソッド本体を定義し、サブクラスが対象とするメソッドを選択できるようにすることができます。
(2) 場合によっては、純粋なインターフェイスだけではクラス間の調整を満たすことができず、異なる関係を区別するためにクラス内の状態を表す変数も必要になります。抽象の仲介的な役割は、これをうまく満たすことができます。
(3) 相互に調整されたメソッドのセットを標準化します。その一部は共通で状態に依存せず、サブクラスが個別に実装する必要なく共有できますが、他のメソッドは各サブクラスが独自のメソッドに従って実装する必要があります。特定の機能を実現するための特定の状態。
関連する推奨事項:
以上がPHPの抽象クラスとインターフェイスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。