Detaillierte Erklärung abstrakter Klassen und Schnittstellen in PHP

小云云
Freigeben: 2023-03-20 14:00:01
Original
1999 Leute haben es durchsucht

Dieser Artikel teilt Ihnen hauptsächlich die detaillierte Erklärung abstrakter Klassen und Schnittstellen in PHP mit und hofft, allen zu helfen.

1. Abstrakte Klasse, abstrakte Klasse

1. Eine abstrakte Klasse bezieht sich auf eine Klasse, der das Schlüsselwort „abstract“ vor der Klasse und eine abstrakte Methode hinzugefügt wird (das Schlüsselwort „abstract“ wird vor dem Schlüsselwort „class method function“ hinzugefügt).

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.

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";  
    }  
}
Nach dem Login kopieren

4. Wenn Sie eine Unterklasse B erstellen, die wie folgt von A erbt, aber die abstrakte Methode abstract_func() nicht implementiert:

Class B extends A{};
Nach dem Login kopieren

Dann wird das Programm den folgenden Fehler haben:

Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::abstract_func)
Nach dem Login kopieren

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 und nur öffentliche Methoden deklarieren, keine Methodenkörper definieren und keine Instanzvariablen deklarieren. Die Schnittstelle kann jedoch 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 benötigen, können Sie es in die entsprechende abstrakte Klasse oder Klasse einfügen.

3. Jede Klasse, die eine Schnittstelle implementiert, muss alle in der Schnittstelle definierten Methoden implementieren
interface iA  
{  
    const AVAR=3;  
    public function iAfunc1();  
    public function iAfunc2();  
}  
echo iA:: AVAR;
Nach dem Login kopieren

class E implements iA  
{  
    public function iAfunc1(){echo "in iAfunc1";}  
    public function iAfunc2(){echo "in iAfunc2";}  
}
Nach dem Login kopieren



Ansonsten muss die Klasse als abstrakt deklariert werden.

  1. abstract class E implements iA{}
    Nach dem Login kopieren
  2. 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. interface iB  
    {  
        public function iBfunc1();  
        public function iBfunc2();  
    }  
    class D extends A implements iA,iB  
    {  
        public function abstract_func1()  
        {  
           echo "implement the abstract_func1 in class A/n";  
        }  
        public function abstract_func2()  
        {  
           echo "implement the abstract_func2 in class A/n";  
        }  
        public function iAfunc1(){echo "in iAfunc1";}  
        public function iAfunc2(){echo "in iAfunc2";}  
        public function iBfunc1(){echo "in iBfunc1";}  
        public function iBfunc2(){echo "in iBfunc2";}  
    }  
       
    class D extends B implements iA,iB  
    {  
        public function abstract_func1()  
        {  
           parent::abstract_func1();  
           echo "override the abstract_func1 in class A/n";  
        }  
        public function abstract_func2()  
        {  
           echo "implement the abstract_func2 in class A/n";  
        }  
        public function iAfunc1(){echo "in iAfunc1";}  
        public function iAfunc2(){echo "in iAfunc2";}  
        public function iBfunc1(){echo "in iBfunc1";}  
        public function iBfunc2(){echo "in iBfunc2";}  
    }
    Nach dem Login kopieren
  2. 5. Eine Schnittstelle kann keine andere Schnittstelle implementieren, aber sie kann mehrere erben

  1. interface iC extends iA,iB{}  
    class F implements iC  
    {  
        public function iAfunc1(){echo "in iAfunc1";}  
        public function iAfunc2(){echo "in iAfunc2";}  
        public function iBfunc1(){echo "in iBfunc1";}  
        public function iBfunc2(){echo "in iBfunc2";}  
    }
    Nach dem Login kopieren
    3. Ähnlichkeiten und Unterschiede zwischen abstrakten Klassen und Schnittstellen

    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:

    (1) Die Schnittstelle muss mithilfe von „implementiert“ implementiert werden, während die abstrakte Klasse mithilfe von „extends“ geerbt werden muss.

    (2) Eine Klasse kann mehrere Schnittstellen implementieren, aber eine Klasse kann nur eine abstrakte Klasse erben.

    (3) Die Schnittstelle betont die Implementierung spezifischer Funktionen, während die abstrakte Klasse die Eigentumsbeziehung betont.

    (4) Obwohl sowohl Schnittstellenimplementierungsklassen als auch Unterklassen abstrakter Klassen 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. Für diese Methoden ohne Zusammenfassung muss der Methodenkörper in einer abstrakten Klasse definiert werden. b) Wenn eine Unterklasse einer abstrakten Klasse diese erbt, kann sie nicht-abstrakte Methoden direkt erben oder überschreiben, sie kann wählen, ob sie implementiert werden soll oder nicht Die Implementierung bleibt den Unterklassen überlassen, diese Klasse muss jedoch 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 zur Koordination spezifische Schnittstellen, 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 gebräuchlichsten 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.

    Verwandte Empfehlungen:

    Zusammenfassung abstrakter Klassen und Schnittstellen

    PHP-Entwurfsmuster 2: abstrakte Klassen und Schnittstellen

    Der Unterschied zwischen abstrakten PHP-Klassen und -Schnittstellen

    Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung abstrakter Klassen und Schnittstellen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage