Kann ich eine Klasse erweitern, wenn ich mehrere Klassen mit Funktionen habe, die ich benötige, aber für die Organisation separat speichern möchte?
dh class a extends b extends c
Bearbeiten: Ich weiß, wie man Klassen einzeln erweitert, aber ich suche nach einer Methode, um eine Klasse sofort mit mehreren Basisklassen zu erweitern - AFAIK Sie können dies in PHP nicht tun, aber es sollte Möglichkeiten geben, dies zu umgehen, ohne darauf zurückzugreifen class c extends b
,class b extends a
Antworten:
Beantworten Sie Ihre Bearbeitung:
Wenn Sie wirklich Mehrfachvererbung vortäuschen möchten, können Sie die magische Funktion __call () verwenden.
Dies ist hässlich, obwohl es aus Sicht des Benutzers der Klasse A funktioniert:
Druckt "abcdef"
quelle
Sie können keine Klasse haben, die zwei Basisklassen erweitert. Das könntest du nicht haben.
Sie könnten jedoch eine Hierarchie wie folgt haben ...
und so weiter.
quelle
Sie könnten Eigenschaften verwenden, die hoffentlich ab PHP 5.4 verfügbar sein werden.
Traits ist ein Mechanismus zur Wiederverwendung von Code in einzelnen Vererbungssprachen wie PHP. Ein Merkmal soll einige Einschränkungen der Einzelvererbung verringern, indem es einem Entwickler ermöglicht wird, Methodensätze in mehreren unabhängigen Klassen, die in unterschiedlichen Klassenhierarchien leben, frei wiederzuverwenden. Die Semantik der Kombination von Merkmalen und Klassen ist so definiert, dass die Komplexität verringert und die typischen Probleme vermieden werden, die mit Mehrfachvererbung und Mixins verbunden sind.
Sie sind für ihr Potenzial zur Unterstützung einer besseren Komposition und Wiederverwendung bekannt, weshalb sie in neuere Versionen von Sprachen wie Perl 6, Squeak, Scala, Slate und Fortress integriert sind. Merkmale wurden auch nach Java und C # portiert.
Weitere Informationen: https://wiki.php.net/rfc/traits
quelle
Klassen sind nicht nur Sammlungen von Methoden. Eine Klasse soll ein abstraktes Konzept darstellen, mit sowohl Zustand (Felder) als auch Verhalten (Methoden), das den Zustand ändert. Die Verwendung der Vererbung, nur um das gewünschte Verhalten zu erzielen, klingt nach einem schlechten OO-Design und genau der Grund, warum viele Sprachen die Mehrfachvererbung nicht zulassen: Um die "Spaghetti-Vererbung" zu verhindern, dh 3 Klassen zu erweitern, da jede eine Methode hat, die Sie benötigen, und am Ende mit Eine Klasse, die 100 Methoden und 20 Felder erbt, jedoch immer nur 5 davon verwendet.
quelle
Ich glaube, es gibt Pläne, bald Mix-Ins hinzuzufügen.
Aber bis dahin gehen Sie mit der akzeptierten Antwort. Sie können das ein wenig abstrahieren, um eine "erweiterbare" Klasse zu erstellen:
Beachten Sie, dass "OtherClass" in diesem Modell $ foo kennenlernt. OtherClass benötigt eine öffentliche Funktion namens "setExtendee", um diese Beziehung einzurichten. Wenn die Methoden dann von $ foo aus aufgerufen werden, kann intern auf $ foo zugegriffen werden. Es wird jedoch keinen Zugriff auf private / geschützte Methoden / Variablen erhalten, wie dies eine echte erweiterte Klasse tun würde.
quelle
Verwenden Sie Merkmale als Basisklassen. Verwenden Sie sie dann in einer übergeordneten Klasse. Erweitere es .
Siehe jetzt Geschäftsfrau logisch geerbtes Geschäft und Mensch beide;
quelle
BusinessWoman
anstelle von verwendenBusinessPerson
? Dann können Sie eine tatsächliche Mehrfachvererbung haben.quelle
Derzeit Antwort von @Franck akzeptiert wird funktionieren , aber es ist nicht in Mehrfachvererbung Tatsache , sondern ein Kind Instanz der Klasse des Bereichs definiert aus, auch gibt es die
__call()
Kurzschrift - man denke nur unter Verwendung von$this->childInstance->method(args)
überall Sie ExternalClass Klassenmethode in „erweiterten“ Klasse benötigen.Genaue Antwort
Nein, Sie können nicht, nicht wirklich, wie das Handbuch des
extends
Schlüsselworts sagt:Echte Antwort
Wie @adam jedoch richtig vorgeschlagen hat, verbietet dies NICHT die Verwendung mehrerer hierarchischer Vererbungen.
Sie können eine Klasse mit einer anderen und eine andere mit einer anderen erweitern und so weiter ...
Ein ziemlich einfaches Beispiel hierfür wäre:
Wichtige Notiz
Wie Sie vielleicht bemerkt haben, können Sie nur dann mehrere (2+) Intehritanzen nach Hierarchie durchführen, wenn Sie die Kontrolle über alle im Prozess enthaltenen Klassen haben. Dies bedeutet, dass Sie diese Lösung nicht anwenden können, z. B. mit integrierten Klassen oder mit Klassen, die Sie verwenden kann einfach nicht bearbeitet werden - wenn Sie das tun möchten, bleibt Ihnen die @Franck-Lösung - untergeordnete Instanzen.
... und zum Schluss Beispiel mit etwas Ausgabe:
Welche Ausgänge
quelle
Ich habe mehrere Artikel gelesen, die von der Vererbung in Projekten (im Gegensatz zu Bibliotheken / Frameworks) abraten und dazu ermutigen, agaisnt-Schnittstellen zu programmieren, nicht gegen Implementierungen.
Sie befürworten auch OO nach Zusammensetzung: Wenn Sie die Funktionen in Klasse a und b benötigen, machen Sie c mit Mitgliedern / Feldern dieses Typs:
quelle
Mehrfachvererbung scheint auf Schnittstellenebene zu funktionieren. Ich habe einen Test auf PHP 5.6.1 gemacht.
Hier ist ein Arbeitscode:
Ich dachte nicht, dass das möglich wäre, aber ich bin auf den SwiftMailer-Quellcode in der Swift_Transport_IoBuffer-Klasse gestoßen, der die folgende Definition hat:
Ich habe noch nicht damit gespielt, aber ich dachte, es könnte interessant sein, es zu teilen.
quelle
Ich habe gerade mein Problem der "Mehrfachvererbung" gelöst mit:
Auf diese Weise kann ich die Sitzung innerhalb einer SessionResponse bearbeiten, wodurch MyServiceResponsetype erweitert wird und die Sitzung weiterhin selbst verarbeitet werden kann.
quelle
Wenn Sie überprüfen möchten, ob eine Funktion öffentlich ist, lesen Sie dieses Thema: https://stackoverflow.com/a/4160928/2226755
Verwenden Sie die Methode call_user_func_array (...) für viele oder nicht Argumente.
So was :
quelle
Sie können dies mit Traits in PHP tun, die ab PHP 5.4 angekündigt wurden
Hier ist ein kurzes Tutorial für Sie: http://culttt.com/2014/06/25/php-traits/
quelle
PHP unterstützt noch nicht die Vererbung mehrerer Klassen, jedoch die Vererbung mehrerer Schnittstellen.
Einige Beispiele finden Sie unter http://www.hudzilla.org/php/6_17_0.php .
quelle
PHP erlaubt keine Mehrfachvererbung, aber Sie können mehrere Schnittstellen implementieren. Wenn die Implementierung "schwer" ist, stellen Sie eine Skelettimplementierung für jede Schnittstelle in einer separaten Klasse bereit. Anschließend können Sie alle Schnittstellenklassen über die Objekteinschließung an diese Skelettimplementierungen delegieren .
quelle
Da Sie nicht genau wissen, was Sie erreichen möchten, würde ich empfehlen, die Möglichkeit zu prüfen, Ihre Anwendung so umzugestalten, dass in diesem Fall eher Komposition als Vererbung verwendet wird.
quelle
Es ist immer eine gute Idee, eine übergeordnete Klasse mit Funktionen zu erstellen ... dh diese gesamte Funktionalität dem übergeordneten Element hinzuzufügen.
Und "verschieben" Sie alle Klassen, die dies hierarchisch verwenden, nach unten. Ich brauche - Funktionen neu schreiben, die spezifisch sind.
quelle
Eines der Probleme von PHP als Programmiersprache ist die Tatsache, dass Sie nur eine einzige Vererbung haben können. Dies bedeutet, dass eine Klasse nur von einer anderen Klasse erben kann.
In den meisten Fällen wäre es jedoch vorteilhaft, von mehreren Klassen zu erben. Beispielsweise kann es wünschenswert sein, Methoden von mehreren verschiedenen Klassen zu erben, um eine Codeduplizierung zu verhindern.
Dieses Problem kann zu einer Klasse führen, die eine lange Familiengeschichte der Vererbung hat, die oft keinen Sinn ergibt.
In PHP 5.4 wurde eine neue Funktion der Sprache hinzugefügt, die als Eigenschaften bekannt ist. Ein Merkmal ist insofern wie ein Mixin, als es Ihnen ermöglicht, Merkmalsklassen in eine vorhandene Klasse zu mischen. Dies bedeutet, dass Sie die Codeduplizierung reduzieren und die Vorteile nutzen können, während Sie die Probleme der Mehrfachvererbung vermeiden.
Züge
quelle
Dies ist keine echte Antwort, wir haben eine doppelte Klasse
...Aber es funktioniert :)
Klasse copy_B ist das Kopieren aller Klassen B.
jetzt
quelle
Klasse A erweitert B {}
Klasse B erweitert C {}
Dann hat A sowohl B als auch C erweitert
quelle
B
. Was wir die meiste Zeit wollen, ist, zwei nicht verwandte KlassenB
undC
(wahrscheinlich aus verschiedenen Bibliotheken) zu haben und gleichzeitig von geerbt zu werdenA
, so dassA
alles von beidenB
undC
, aberB
nichts vonC
und umgekehrt enthält.