Dieser Artikel stellt hauptsächlich die Unterschiede zwischen Static, Final, Interface und Abstract in PHP vor. Jetzt kann ich ihn mit Ihnen teilen
Wenn eine Methode in der übergeordneten Klasse als endgültig deklariert wird, kann die Unterklasse die Methode nicht überschreiben. Wenn eine Klasse als final deklariert ist, kann sie nicht vererbt werden.
Hinweis: Eigenschaften können nicht als endgültig definiert werden, nur Klassen und Methoden können als endgültig definiert werden.
Statische Variablen können lokale Variablen oder globale Variablen sein. Wenn ein Programmabschnitt ausgeführt wird, verschwindet die statische Variable nicht im Speicher und wird beim nächsten Mal definiert. Es ist immer noch der vorherige Wert. Er wird häufig verwendet, um den vorherigen Wert in Rekursionen oder Unterfunktionen beizubehalten. Dies wird auch im Singleton-Modus verwendet. Im Allgemeinen werden statische Attribute zum Speichern öffentlicher Klassendaten verwendet
2 Innerhalb statischer Methoden kann nur auf statische Eigenschaften zugegriffen werden, einschließlich derer dieser Klasse und der übergeordneten Klasse
3 ohne Objekte zu instanziieren
4. Verwenden Sie das Schlüsselwort self oder static, um auf statische Eigenschaften innerhalb dieser Klasse zuzugreifen. Die folgenden Variablen müssen $ enthalten, wie zum Beispiel: self::$a
5. Greifen Sie auf das übergeordnete Element zu. Verwenden Sie das übergeordnete Element für statische Klassenattribute, z. B.: parent::$name
6. Wenn Sie auf statische Variablen oder Methoden außerhalb der Klasse zugreifen, verwenden Sie den Klassennamen, um direkt ohne Instanziierung darauf zuzugreifen . Zum Beispiel: Me::$pan und Me::abc()
abstract
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.
4. Wenn die Unterklasse eine abstrakte Methode implementiert, kann die Zugriffskontrolle der abstrakten Methode in der Unterklasse nicht strenger sein als die Zugriffskontrolle der abstrakten Methode in der übergeordneten Klasse, d. h. (A-Elternklasse, B-Unterklasse)
(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 kann B die Deklaration von abstract_func() in A öffentlich oder geschützt sein, aber nicht privat sein
(3) Wenn abstract_func() in A als privat deklariert ist, kann es nicht als definiert werden Privat! (
Schwerwiegender Fehler: Abstrakte Funktion A::abstract_func() kann nicht als privat deklariert werden)Schnittstelle
2. Die Schnittstelle ist vollständig abstrakt. Sie kann nur Methoden und nur öffentliche Methoden deklarieren. Sie kann keine Methodenkörper definieren und keine Instanzvariablen deklarieren.
3. Die Schnittstelle kann 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.
4. Jede Klasse, die eine Schnittstelle implementiert, muss alle in der Schnittstelle definierten Methoden implementieren, andernfalls muss die Klasse als abstrakt deklariert werden.
5. 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.
6. 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.
7. Eine Schnittstelle kann keine andere Schnittstelle implementieren, kann aber mehrere erben
3. Ähnlichkeiten und Unterschiede zwischen abstrakten Klassen und Schnittstellen
(2) Schnittstellenimplementierungsklassen und Unterklassen der abstrakten Klasse müssen die deklarierten abstrakten Methoden implementieren.
2. Unterschiede:
(1) Die Schnittstelle muss mithilfe von „implements“ implementiert werden, und die abstrakte Klasse muss mithilfe von „extends“ geerbt werden.
(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 Auswahl hat zwei Bedeutungen:
a) Nicht alle Methoden in der abstrakten Klasse sind abstrakt. Nur die Methoden mit abstrakt sind abstrakt und Unterklassen müssen sie implementieren. Für diese Methoden ohne Zusammenfassung muss der Methodenkörper in der abstrakten Klasse definiert werden.
b) Wenn eine Unterklasse der abstrakten Klasse ihn erbt, kann sie nicht-abstrakte Methoden direkt erben oder überschreiben Sie können wählen, ob Sie es implementieren möchten, oder Sie können es seinen Unterklassen überlassen, aber diese Klasse muss auch als abstrakte Klasse 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 einen Standardmethodenkörper für die Verwendung durch Unterklassen definieren es direkt oder überschreiben Sie es. Darüber hinaus kann es durch Vererbung eigene Instanzvariablen zur Verwendung durch Unterklassen definieren.
(6) Das Schlüsselwort abstract kann nicht hinzugefügt werden, bevor die abstrakte Methode in der Schnittstelle verwendet wird. Die implizite Standardmethode ist die abstrakte Methode, und das Schlüsselwort final 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) Es existiert als Bezeichner, der eine bestimmte Funktion realisieren 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) Definieren Sie eine Reihe von Schnittstellen, möchten Sie jedoch nicht jede Implementierungsklasse dazu 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 ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Die Unterschied zwischen Define und Const in PHP
Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen statisch, endgültig, Schnittstelle und abstrakt in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!