Abstrakte Klassen und Schnittstellen sind nicht spezifisch für PHP; Sie sind Merkmale vieler moderner objektorientierter Sprachen.
Eine abstrakte Klasse ist eine Klasse mit einer oder mehreren nicht implementierten Elementfunktionen. Sie würden eine in einer Situation verwenden, in der Sie eine Gruppe von Klassen mit ähnlichen Verhaltensweisen möchten, die sich nur in wenigen Methoden unterscheiden. Jede dieser Klassen würde von der abstrakten Klasse abgeleitet sein und die nicht implementierten Methoden in der Weise implementieren, die für ihren speziellen Fall geeignet ist.
Eine Schnittstelle ähnelt einer abstrakten Klasse, enthält jedoch keine Methodenimplementierungen, nur Signaturen. Eine Klasse, die eine Schnittstelle implementiert, muss alle Methoden implementieren.
Eine Klasse kann viele Interfaces implementieren, kann aber nur von einer abstrakten Klasse (oder Elternklasse irgendeiner Art) abgeleitet werden, da PHP keine Mehrfachvererbung unterstützt.
Sowohl abstrakte Klassen als auch Schnittstellen ermöglichen Polymorphie; Das heißt, Sie können eine Referenz als einen abstrakten Typ angeben (der sich auf jede von ihr abgeleitete Instanz der Klasse beziehen könnte) oder auf ein Objekt, das eine Schnittstelle implementiert.
Wenn Sie verstehen, warum Sie sie in anderen Sprachen verwenden, gelten dieselben Konzepte für PHP. Schnittstellen sind Klassen "Signaturen" ... sie enthalten keinen Code. Abstrakte Klassen können nicht instanziiert werden, aber sie können sowohl implementierte als auch abstrakte (leere) Funktionen enthalten.
Beachten Sie, dass eine Klasse nur eine einzelne übergeordnete Klasse (oder abstrakte Klasse) erweitern kann, aber sie kann so viele Schnittstellen implementieren, wie sie benötigt.
Aber da PHP keine strikte Typisierung hat und kein Konzept für Kompilierzeitprüfungen hat, können Sie normalerweise ohne sie auskommen, anders als in Sprachen wie C ++ oder Java.
Das Kern-PHP benötigt für einige Dinge Schnittstellen. Zum Beispiel:
%Vor% Wenn Sie "Zählbares Gerät" entfernen, ruft PHP Ihre Methode count
nicht auf. Es gibt viele andere Schnittstellen, die Sie implementieren können, damit benutzerdefinierte Objekte sich alle auf ähnliche Weise verhalten. Zum Beispiel können Sie ein Objekt erstellen, das mit einer foreach
Iteration arbeitet.
Schnittstellen auf Benutzerebene sind in PHP nicht sehr nützlich, wie ich bereits erwähnt habe. Wenn Sie jedoch Typhinweise verwenden, können sie sein:
%Vor% Wenn someMethod
in MyInterface
deklariert ist, ist garantiert, dass der Aufruf von $bar->someMethod()
existiert. (Der Grund, warum dies in PHP nicht so nützlich ist wie in anderen Sprachen, liegt daran, dass der Typhinweis in der Funktionssignatur erst zur Laufzeit überprüft wird.)
Leere Schnittstellen können auch nützlich sein, um Klassen zu kategorisieren. Angenommen, Sie möchten etwas für eine bestimmte Gruppe von Objekten tun. Sie könnten alle eine leere Schnittstelle implementieren. Dann könnte Ihr Code einfach nach dieser Schnittstelle suchen, ohne jemals etwas über das Objekt wissen zu müssen.
%Vor%Abstrakte Klassen sind nützlich, wenn Sie viel Code haben, der zwischen Unterklassen geteilt wird, aber für sich allein nicht sinnvoll ist. Sie können die Basisklasse als abstrakt deklarieren, alle freigegebenen Funktionen implementieren und den Rest der Funktionen leer lassen. Wenn diese Basisklasse als abstrakt deklariert wird, wird niemand sie jemals alleine verwenden können.
Eine Schnittstelle definiert eine Reihe von Methoden, die eine Klasse implementieren muss. Eine solche Klasse implementiert die Schnittstelle, indem sie eine konkrete Implementierung dieser Methoden bereitstellt. Eine Schnittstelle darf keine eigene Implementierung enthalten. Es ist nur eine Reihe von Methodensignaturen. Wenn ich eine Schnittstelle namens ILogger
definiere, kann ich Code schreiben, der die in ILogger
(möglicherweise write
und writeLine
) definierten Methoden verwendet, um Nachrichten weiterzuleiten, die protokolliert werden sollen. Ich kann in jeder Klasse übergeben, die ILogger
implementiert, und es ist alles gleich mit dem Client-Code.
Eine abstrakte Klasse ist ähnlich, kann aber einige Methoden und Zustände implementieren. Abstrakte Klassen können nicht instanziiert werden und jede Klasse, die sie erweitert, muss eine Implementierung für jede abstract
-Methode in der übergeordneten Klasse bereitstellen. Wenn eine Gruppe von Klassen einige Implementierungsdetails gemeinsam hat, sich aber in anderen unterscheidet, können Sie die gemeinsam genutzte Implementierung in einer abstrakten Klasse definieren, die abweichenden Methoden als abstrakt deklarieren und untergeordnete Klassen diese mit ihrer eigenen Implementierung füllen. Wenn ich einen einheitlichen Weg zum Sammeln von Systeminformationen, Hinzufügen von Zeitstempeln usw. wünschen, die von allen meinen Loggern geteilt werden, könnte ich eine abstrakte Klasse LoggerBase
erstellen, die diese Details behandelt und write
und writeLine
% co_de markiert %, sodass alle Klassen, die abstract
erweitern, nur angeben müssen, wie sie in ihr jeweiliges Protokoll schreiben sollen.
Tags und Links php oop codeigniter cakephp