ホームページ >バックエンド開発 >PHPチュートリアル >PHP の抽象クラスとインターフェイス

PHP の抽象クラスとインターフェイス

WBOY
WBOYオリジナル
2016-08-08 09:22:461456ブラウズ

1. 抽象クラス 抽象クラス

1.抽象クラスとは、クラスと抽象メソッド(クラスメソッドの関数キーワードの前に抽象キーワード)の前に抽象キーワードを追加したクラスを指します。

2.抽象クラスは直接インスタンス化できません。抽象クラスは、サブクラスに必要なメソッドのみを定義 (または部分的に実装) します。サブクラスは、抽象クラスを継承し、抽象クラス内のすべての抽象メソッドを実装することによって、抽象クラスを具体化できます。

3.サブクラスをインスタンス化する必要がある場合は、抽象クラス内のすべての抽象メソッドを実装する必要があります。サブクラスが抽象クラス内のすべての抽象メソッドを実装していない場合、そのサブクラスも抽象クラスであり、クラス内でその前に abstract キーワードを付ける必要があり、インスタンス化できません。

[c-sharp] view plaincopyprint?

  1. abstract class A
  2. {
  3. /** 変数は抽象クラスで定義できます*/
  4. 保護されています $value1 = 0;
  5. プライベート $value2 = 1;
  6. $value3 = 2; my_print()
  7. {
  8. echo "hello,world/n"
  9. /**非抽象メソッドを定義することもできます*/
  10. abstract
  11. protected
  12. function abstract_func1();
  13. 要約 protected 関数 abstract_func2();
  14. abstract
  15. class
  16. B は A を拡張します
  17. public 関数 abstract_func1()
  18. {
  19. echo "クラス A に abstract_func1 を実装する/n"; }
  20. /**
  21. * ほとんどの場合、抽象クラスには少なくとも 1 つの抽象メソッドが含まれます。抽象メソッドは、abstract キーワードを使用して宣言され、特定のコンテンツを持つことはできません。音声画像 ※一般的なクラスメソッドと同様に抽象メソッドを宣言できますが、メソッド本体ではなくセグメンテーションで終了する必要があります。つまり、抽象メソッドを抽象クラスに実装することはできません。つまり、関数本体「{一部のコード}」は存在しません。
  22. */
  23. //abstract protected function abstract_func2();
  24. }
  25. クラス C は B を拡張します
  26. {
  27. public function abstract_func2()
  28. {
  29. echo "クラス A/n に abstract_func2 を実装します" ;
  30. }
  31. }
  32. 4.次のように A から継承するが、抽象メソッド abstract_func() を実装しないサブクラス B を作成するとします。
  33. その場合、プログラムには次のエラーが発生します:
  34. [php] view plaincopyprint?
    1. 致命的なエラー: クラス B には 1 つの abstract メソッド and が含まれているため、abstract または 残りのメソッド (A::abstract_func) を実装する必要があります

    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.インターフェイスは完全に抽象的であり、メソッド本体を定義することはできず、パブリック メソッドのみを宣言することはできません。ただし、インターフェース は定数変数を宣言できます。しかし、インターフェイスに定数変数を配置することは、インターフェイスとしての存在目的に違反し、インターフェイスとクラスの異なる値を混乱させます。本当に必要な場合は、対応する要約に含めることができます クラスまたはクラスイン。

    [php] plaincopyprint を表示します?

    1. インターフェース iA
    2. {
    3. const AAR=3; public
    4. function iAfunc1(); public
    5. function iAfunc2(); echo iA::AVAR; 3.インターフェイスを実装するクラスは、インターフェイスで定義されているすべてのメソッドを実装する必要があります
    6. [php] view plaincopyprint?
    class

    public

    function

    iAfunc1(){echo

    "in iAfunc1" ;}
    1. public function iAfunc2(){echo
    2. "in iAfunc2"
    3. ;}
    4. }
    5. それ以外の場合、クラスは abstract と宣言する必要があります。 [php] plaincopyprint を表示?
    6. abstract classクラスは、宣言内でimplements キーワードを使用してインターフェイスを実装できます。これを実行した後、インターフェイスを実装する具体的なプロセスは、抽象メソッドのみを含む抽象クラスを継承するのと同じになります。クラスは親クラスを継承し、同時に任意の数のインターフェイスを実装できます。 extends 句は、implements 句の前に置く必要があります。 PHP は 1 つの親クラスからの継承のみをサポートするため、extends キーワードの後に​​はクラス名のみを指定できます。
    7. [php] plaincopyprint を表示しますか?
    1. インターフェース iB
    2. {
    3. public function iBfunc1();  
    4. public function iBfunc2();  
    5. }
    6. クラス D 拡張 A 実装 iA,iB
    7. {
    8. public 関数 abstract_func1()
    9. {
    10. エコー 「クラス A/n に abstract_func1 を実装する」;  
    11. }
    12. public function abstract_func2()
    13. {
    14. echo 「クラスA/nにabstract_func2を実装する」;  
    15. }
    16. public function iAfunc1(){echo "in iAfunc1";}
    17. public 関数 iAfunc2(){echo "in iAfunc2"; }
    18. public function iBfunc1(){echo "in iBfunc1";}
    19. public function iBfunc2( ){echo 「iBfunc2 内」;}
    20. }
    21. クラス D 拡張 B 実装 iA,iB
    22. {
    23. public function abstract_func1()
    24. {
    25. 親::abstract_func1();  
    26. echo 「クラスA/nのabstract_func1をオーバーライドします」;  
    27. }
    28. public function abstract_func2()
    29. {
    30. echo 「クラスA/nにabstract_func2を実装する」;  
    31. }
    32. public function iAfunc1(){echo "in iAfunc1";}
    33. public 関数 iAfunc2(){echo "in iAfunc2"; }
    34. public function iBfunc1(){echo "in iBfunc1";}
    35. public function iBfunc2( ){echo 「iBfunc2 内」;}
    36. }

    5 .インターフェイス不可实现另一インターフェイス,しかし可继承多个

    [php] view plaincopyprint?

    1. インターフェース iC 拡張iA,iB{}
    2. クラスF 実装iC
    3. {
    4. パブリック 関数 iAfunc1(){エコー " in iAfunc1";}
    5. public function iAfunc2(){echo "in iAfunc2";}
    6. public function iBfunc1(){echo "in iBfunc1" ;} public
    7. function iBfunc2(){echo "in iBfunc2";} }
    8. 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の抽象クラス(abstract class)とインターフェース(interface)について内容を含めて紹介しましたが、PHPチュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。