Heim  >  Artikel  >  Backend-Entwicklung  >  Abstrakte Klasse und Schnittstelle in PHP

Abstrakte Klasse und Schnittstelle in PHP

WBOY
WBOYOriginal
2016-08-08 09:22:461431Durchsuche

1. Abstrakter Unterricht

1. Eine abstrakte Klasse bezieht sich auf eine Klasse, bei der das Schlüsselwort „abstrakt“ vor der Klasse hinzugefügt wird, und auf eine abstrakte Methode (das Schlüsselwort „abstrakt“, das vor dem Funktionsschlüsselwort „Klassenmethode“ hinzugefügt wird).

2. Abstrakte Klassen können nicht direkt instanziiert werden. Die abstrakte Klasse definiert (oder implementiert) nur die von der Unterklasse benötigten Methoden. Unterklassen können eine abstrakte Klasse konkretisieren, indem sie sie erben und alle abstrakten Methoden in der abstrakten Klasse implementieren.

3. Wenn eine Unterklasse instanziiert werden muss, muss sie alle abstrakten Methoden in der abstrakten Klasse implementieren. Wenn die Unterklasse nicht alle abstrakten Methoden in der abstrakten Klasse implementiert, ist die Unterklasse ebenfalls eine abstrakte Klasse und muss in der Klasse durch das Schlüsselwort abstract vorangestellt werden und kann nicht instanziiert werden.

[c-sharp] view plaincopyprint?

  1. abstract class A
  2. {
  3. > geschützt $value1 = 0;
  4. privat $value2 = 1;
  5. public $value3 = 2;
  6. 🎜> public function my_print()
  7. { echo
  8. "hello,world/n"
  9. ; >
  10.  /**Variablen können in abstrakten Klassen definiert werden*/
  11.  
  12. abstract
  13. protected function abstract_func1();
  14. abstract_func2(); }
  15. Zusammenfassung
  16. Klasse B erweitert A {
  17. public function abstract_func1()
  18. > echo "implementiere die abstract_func1 in Klasse A/n";
  19. } /**Sie können auch nicht abstrakte Methoden definieren*/
  20. //abstract protected function abstract_func2();
  21. class
  22. C erweitert B 
  23.  public
  24. function abstract_func2()
  25. {
  26. echo "implementiere abstract_func2 in Klasse A/n"
  27.                                                                                                                        Wenn Sie eine Unterklasse B erstellen, die wie folgt von A erbt, aber die abstrakte Methode abstract_func() nicht implementiert:
  28. [php] view plaincopyprint?
  29. Klasse B erweitert
  30. A{};
  31. Dann wird das Programm den folgenden Fehler haben:
  32. [php] Plaincopyprint anzeigen?
    1. Fataler Fehler: Klasse B enthält 1 AbstractMethode und muss daher als Abstract oder die restlichen Methoden implementieren (A::abstract_func)

    5. Wenn B die abstrakte Methode abstract_func() implementiert, kann die Zugriffskontrolle der Methode abstract_func() in B nicht strenger sein als die Zugriffskontrolle von abstract_func() in A, das heißt:

    (1) Wenn abstract_func in A () als öffentlich deklariert ist, kann die Deklaration von abstract_func() in B nur öffentlich, nicht geschützt oder privat sein

    (2) Wenn abstract_func() in A als geschützt deklariert ist, dann die Deklaration von abstract_func() in B Die Deklaration kann öffentlich oder geschützt sein, aber nicht privat

    (3) Wenn abstract_func() in A als privat deklariert ist, hehe, kann es nicht als privat definiert werden! (Schwerwiegender Fehler: Abstrakte Funktion A::abstract_func() kann nicht als privat deklariert werden)

    2. Abstrakte Klassen stellen Standards für die konkrete Implementierung bereit, während Schnittstellen reine Vorlagen sind. Schnittstellen definieren nur Funktionen, keinen Implementierungsinhalt. Schnittstellen werden mit dem Schlüsselwort interface deklariert.

    2. Die Schnittstelle ist vollständig abstrakt. Sie kann nur Methoden deklarieren, private und geschützte Methoden können nicht definiert werden, und Instanzvariablen können nicht deklariert werden. Allerdings kann

    Schnittstelle

    konstante Variablen deklarieren. Das Platzieren konstanter Variablen in einer Schnittstelle verstößt jedoch gegen den Zweck ihrer Existenz als Schnittstelle und bringt außerdem die unterschiedlichen Werte von Schnittstellen und Klassen durcheinander. Wenn Sie es wirklich brauchen, können Sie es in die entsprechende Zusammenfassung einfügen Klasse oder Klasse in. [php] view plaincopyprint?

    Schnittstelle iA
    1. {
    2. const AVAR=3;
    3. public
    4. Funktion iAfunc1();
    5. echo iA:: AVAR; 3. Jede Klasse, die eine Schnittstelle implementiert, muss alle in der Schnittstelle definierten Methoden implementieren
    6. [php] view plaincopyprint?
    7. Klasse
    E

    implementiert

    iA

    {

    1. öffentlich function iAfunc1(){echo "in iAfunc1"
    2. ;}
    3. public
    4. function iAfunc2 ( ){echo "in iAfunc2";} }
    5. Ansonsten muss die Klasse als abstrakt deklariert werden. [php] Plaincopyprint anzeigen?
    6. Abstract

    Klasse

    E

    implementiert

    iA{}

      4. Eine Klasse kann eine Schnittstelle mithilfe des Schlüsselworts „implements“ in ihrer Deklaration implementieren. Danach entspricht der spezifische Prozess der Schnittstellenimplementierung dem Erben einer abstrakten Klasse, die nur abstrakte Methoden enthält. Eine Klasse kann eine übergeordnete Klasse erben und beliebig viele Schnittstellen gleichzeitig implementieren. Die Extens-Klausel sollte vor der Implements-Klausel stehen. PHP unterstützt nur die Vererbung von einer übergeordneten Klasse, daher kann auf das Schlüsselwort „extens“ nur ein Klassenname folgen.
    1. [php] Plaincopyprint anzeigen?
      1. Schnittstelle iB  
      2. {  
      3.     öffentlich Funktion iBfunc1();  
      4.     public function iBfunc2();  
      5. }  
      6. Klasse D erweitert A umsetzt iA, iB  
      7. {  
      8.     public function abstract_func1()  
      9.     {  
      10.        echo "implementiere the abstract_func1 in class A/n";  
      11.     }  
      12.     public function abstract_func2()  
      13.     {  
      14.        echo "implementiere the abstract_func2 in class A/n";  
      15.     }  
      16.     public function iAfunc1(){echo "in iAfunc1 ";}  
      17. ;}      public function iBfunc1(){echo 
      18. "in iBfunc1"
      19. ;}      public function iBfunc2(){echo 
      20. "in iBfunc2"
      21. ;}  }     
      22. Klasse
      23.  D 
      24. erweitert B 
      25. umsetzt
      26.  iA,iB  {      public
      27.  
      28. function abstract_func1()  
      29.     {        parent::abstract_func1();  
      30.        echo 
      31. "override the abstract_func1 in class A/n"
      32. ;  
      33.     }  
      34.     public
      35.  
      36. function abstract_func2()  
      37.     {         echo 
      38. "implementiere the abstract_func2 in class A/n"
      39. ;  
      40.     }  
      41.     public
      42.  
      43. function iAfunc1(){echo 
      44. "in iAfunc1 "
      45. ;}  ;}      public 
      46. function
      47.  iBfunc1(){echo "in iBfunc1";}      public 
      48. function
      49.  iBfunc2(){echo "in iBfunc2";}  }  
      50. 5 🎜>
        1. Schnittstelle iC erweitert iA,iB{}
        2. Klasse F implementiert iC
        3. {
        4. (){echo "in iAfunc1";} "in iAfunc2";}
        5. ;}  öffentliche Funktion iBfunc2(){echo 
        6. "in iBfunc2"
        7. ;} }
        8. 3. Ähnlichkeiten und Unterschiede zwischen abstrakten Klassen und Schnittstellen
        9. 1. Ähnlichkeiten: (1 ) Beide sind abstrakte Klassen und können nicht instanziiert werden. (2) Sowohl die Schnittstellenimplementierungsklasse als auch die Unterklassen der abstrakten Klasse müssen die deklarierten abstrakten Methoden implementieren. 2. Unterschiede:
        10. (1) Die Schnittstelle muss mithilfe von „implements“ implementiert werden, während die abstrakte Klasse mithilfe von „extends“ geerbt werden muss.
        11. (2) Eine Klasse kann mehrere Schnittstellen implementieren, aber eine Klasse kann nur eine abstrakte Klasse erben.
        12. (3) Die Schnittstelle betont die Implementierung spezifischer Funktionen, während die abstrakte Klasse die Eigentumsbeziehung betont.
        (4) Obwohl sowohl Schnittstellenimplementierungsklassen als auch abstrakte Klassenunterklassen entsprechende abstrakte Methoden implementieren müssen, sind die Implementierungsformen unterschiedlich. Jede Methode in der Schnittstelle ist eine abstrakte Methode, die nur deklariert wird (Deklaration, kein Methodenkörper) und von der Implementierungsklasse implementiert werden muss. Unterklassen einer abstrakten Klasse können selektiv implementiert werden. Diese Wahl hat zwei Auswirkungen: a) Nicht alle Methoden in einer abstrakten Klasse sind abstrakt. Nur die Methoden mit abstrakt sind abstrakt und müssen von Unterklassen implementiert werden. Diese Methoden ohne Zusammenfassung sind abstrakt Der Methodenkörper muss in der Klasse definiert werden. b) Wenn eine Unterklasse einer abstrakten Klasse ihn erbt, kann sie nicht-abstrakte Methoden direkt erben oder überschreiben. Bei abstrakten Methoden kann sie diese entweder implementieren oder ihr überlassen Unterklassen zu implementieren, aber diese Klasse muss auch als abstrakt deklariert werden. Da es sich um eine abstrakte Klasse handelt, kann sie natürlich nicht instanziiert werden.

        (5) Die abstrakte Klasse ist der Vermittler zwischen Schnittstelle und Klasse. Die abstrakte Klasse spielt eine verbindende Rolle zwischen Schnittstelle und Klasse. Einerseits ist eine abstrakte Klasse abstrakt und kann abstrakte Methoden deklarieren, um die Funktionen zu standardisieren, die Unterklassen implementieren müssen. Andererseits kann sie Standardmethodenkörper für die direkte Verwendung oder Überschreibung durch Unterklassen definieren. Darüber hinaus kann es durch Vererbung eigene Instanzvariablen zur Verwendung durch Unterklassen definieren.

        (6) Das abstrakte Schlüsselwort kann nicht vor der abstrakten Methode in der Schnittstelle hinzugefügt werden. Die abstrakte Methode ist standardmäßig implizit und das letzte Schlüsselwort kann nicht hinzugefügt werden, um die Vererbung abstrakter Methoden zu verhindern. In einer abstrakten Klasse muss „abstract“ vor der abstrakten Methode hinzugefügt werden, um anzuzeigen, dass sie explizit als abstrakte Methode deklariert ist.

        (7) Abstrakte Methoden in Schnittstellen sind standardmäßig öffentlich und können nur öffentlich sein. Sie können nicht mit privaten oder geschützten Modifikatoren geändert werden. Abstrakte Methoden in abstrakten Klassen können mit public und protected geändert werden, jedoch nicht mit private.

        3. Anwendungsfälle der Schnittstelle

        (1) Klassen benötigen spezifische Schnittstellen zur Koordination, unabhängig davon, wie sie implementiert werden.

        (2) existiert als Bezeichner, der eine bestimmte Funktion implementieren kann, oder es kann ein reiner Bezeichner ohne Schnittstellenmethoden sein.

        (3) Es ist notwendig, eine Klassengruppe als eine einzelne Klasse zu behandeln, und der Anrufer kontaktiert diese Klassengruppe nur über die Schnittstelle.

        (4) Es ist notwendig, mehrere spezifische Funktionen zu implementieren, und diese Funktionen haben möglicherweise überhaupt keine Verbindung.

        4. Anwendungsfälle der abstrakten Klasse

        Kurz gesagt, Sie können sie verwenden, wenn Sie sowohl eine einheitliche Schnittstelle als auch Instanzvariablen oder Standardmethoden benötigen. Die häufigsten sind:

        (1) Definiert eine Reihe von Schnittstellen, möchte aber nicht jede Implementierungsklasse zwingen, alle Schnittstellen zu implementieren. Sie können eine abstrakte Klasse verwenden, um eine Reihe von Methodenkörpern oder sogar leere Methodenkörper zu definieren, und dann Unterklassen die Methoden auswählen lassen, die sie abdecken möchten.

        (2) In einigen Fällen können reine Schnittstellen allein die Koordination zwischen Klassen nicht erfüllen. Zur Unterscheidung verschiedener Beziehungen werden auch Variablen benötigt, die Zustände in der Klasse darstellen. Die Vermittlerrolle des Abstrakten kann dies sehr gut erfüllen.

        (3) Standardisiert eine Reihe gegenseitig koordinierter Methoden, von denen einige gemeinsam und zustandsunabhängig sind und gemeinsam genutzt werden können, ohne dass Unterklassen sie separat implementieren müssen, während andere Methoden erfordern, dass jede Unterklasse sie implementiert nach eigenem spezifischen Zustand, um bestimmte Funktionen zu erreichen.

        Das Obige hat die abstrakte Klasse (abstrakte Klasse) und die Schnittstelle (Schnittstelle) in PHP vorgestellt, einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn