Die zweiten beiden Säulen von OOP
Wie ich im ersten Beitrag dieser Serie erwähnt habe, werden Sie oft von den drei Säulen der objektorientierten Programmierung hören. Vielleicht hören Sie auch von den vier Säulen der objektorientierten Programmierung.
Und es ist nicht so, dass es insgesamt sieben oder so etwas gibt. Stattdessen geht es eher darum, was die Leute als grundlegend für OOP betrachten: Gibt es drei oder vier Hauptkonzepte?
Sie können aus dem vorherigen Artikel vermuten (geschweige denn aus dem Titel), ich glaube, es gibt vier.
Und in diesem Beitrag werde ich die letzten beiden behandeln:
- Nachlass,
- und Polymorphismus
Wenn Sie vor dem Lesen dieses Artikels mit objektorientierter Programmierung gearbeitet haben, haben Sie wahrscheinlich von mindestens einem davon gehört.
Unabhängig davon, werfen wir einen genaueren Blick auf jeden von ihnen.
Zwei weitere Säulen von OOP
Bevor ich mich mit jedem dieser Themen befasse, möchte ich sichergehen, dass Sie mit dem, was wir bisher behandelt haben, auf dem Laufenden sind.
Ein Wort zur Analyse
Ich werde den Punkt nicht vertiefen, aber der ganze Grund, warum ich jetzt über objektorientierte Grundlagen spreche, ist, dass wir uns in eine andere Phase dieses Materials bewegen. Wir begannen mit der Analysephase, die Folgendes beinhaltete:
Nun zur Entwicklung
Und jetzt kommen wir in die Entwicklungsphase. Einige mögen es Grundlagen nennen (aber ich bin der Meinung, dass Sie ohne die Grundlagen keine gute Entwicklung durchführen können, also gibt es das (.
Wenn Sie den vorherigen Beitrag nicht gelesen haben, empfehle ich Ihnen, dies zu tun, bevor Sie fortfahren, da er die Konzepte von Abstraktion, Kapselung und deren Beziehung zu WordPress behandelt.
3 Erbschaft
Das Konzept der Vererbung ist ziemlich einfach zu befolgen. Das heißt, eine Klasse kann Attribute einer anderen Klasse erben. Ich werde gleich ein paar Beispiele dafür geben, aber lassen Sie mich eine Arbeitsdefinition für die Zwecke dieses Beitrags geben:
Vererbung bezieht sich auf die Idee, dass eine Klasse, obwohl sie ihre eigene Implementierung hat, buchstäblich Eigenschaften, Funktionen und die allgemeine Implementierung von einer übergeordneten Klasse erbt.
Beispiel 1: Ein Dokument
Nehmen wir ganz einfach an, Sie haben eine Klasse namens Document und ein Dokument hat einen Titel und einen Inhalt. Dann gibt es eine Unterklasse von document, die Attribute für ein Datum und eine Uhrzeit hat. Wir könnten dies PostDocument oder PageDocument nennen.
Das heißt, das PageDocument erbt die Eigenschaften und Attribute von Document und fügt ihm gleichzeitig seine eigene Implementierung hinzu. Sinn ergeben?
Wenn nicht, keine Sorge. Es macht am Anfang nicht immer „Klick“, also schauen wir uns ein anderes Beispiel an.
Beispiel 2: Eine Nachricht
Nehmen wir an, wir haben eine Message-Klasse. Eine Nachricht hat typischerweise zwei Eigenschaften:
- 1 Ein Absender,
- 2 Ein Empfänger.
Es ist jedoch fair zu sagen, dass es verschiedene Arten von Nachrichten gibt, oder? Das heißt, vielleicht haben wir eine EmailMessage oder vielleicht haben wir eine TextMessage.
Eine E-Mail-Nachricht hat immer noch einen Absender und einen Empfänger, aber sie hat so viel mehr, richtig? Es hat Dinge wie:
- eine Betreffzeile,
- ein optionaler Anhang,
- eine andere Gruppe von Absendern, an die es gesendet wird,
- Unterstützung für das Kopieren anderer in die Nachricht öffentlich oder privat,
- und vieles mehr.
Eine TextMessage hingegen hat nicht unbedingt alle oben genannten Eigenschaften. Nehmen wir an, wir sprechen über eine einfache SMS-Nachricht (im Gegensatz zu einer Rich-Text-Nachricht in etwas wie Hangouts, Telegram, iMessage oder was auch immer es sonst noch gibt).
Diese Klasse wird:
- an eine Telefonnummer gebunden sein,
- kann eine Gruppe anderer Empfänger umfassen, die alle öffentlich sind,
- ein Netzbetreiber (d. h. ein Mobilfunkanbieter),
- eine maximale Anzahl von Zeichen, die es enthalten kann
- die Möglichkeit, eine einzelne Nachricht in mehrere Nachrichten aufzuteilen, wenn die maximale Anzahl von Zeichen eine bestimmte Anzahl von Zeichen überschreitet.
Aber es wirft immer noch Fragen zu Eigenschaften und Methoden auf (oder allgemeiner zur Implementierung, oder?)
Ein Wort zur Umsetzung
Wenn es um objektorientierte Programmierung geht, haben wir sogenannte Zugriffsmodifikatoren. Vielleicht haben Sie sie an anderer Stelle gelesen, die beispielsweise als Sichtbarkeitsmodifikatoren oder ähnliches bezeichnet werden.
Es ist alles das Gleiche.
Kurz gesagt, diese Modifikatoren können wie folgt definiert werden:
Schlüsselwörter, die steuern, welche anderen Klassen Zugriff auf die vorliegenden Informationen haben.
Glücklicherweise ist dieser Teil einfach zu verstehen:
- Private Eigenschaften und Funktionen sind nur für die Klasse zugänglich, in der sie definiert sind. Das bedeutet, dass PostDocument nichts in Document verwenden kann, was als privat gekennzeichnet ist. PostDocument ist sich nicht einmal bewusst, dass diese Informationen existieren.
- geschützte Eigenschaften und Funktionen sind für die Klasse zugänglich, in der sie definiert sind, und für jede Klasse, die als Nachkomme gilt. Das heißt, jede Klasse, die Daten von der Basisklasse oder der Elternklasse erbt, hat Zugriff darauf. Im Gegensatz zu privaten Implementierungsdetails kann das PostDocument also auf Informationen aus Document zugreifen, wenn es als geschützt gekennzeichnet ist.
- Öffentliche Eigenschaften und Funktionen sind für jeden zugänglich. Das hat eigentlich nichts mit Vererbung zu tun, sondern eher mit Kapselung, wenn überhaupt. Stattdessen geht es darum, zu entscheiden, worauf andere Objekte zugreifen sollen.
Wie wird also die Umsetzung gehandhabt? Dies ist von Sprache zu Sprache unterschiedlich, aber PHP unterstützt nicht die sogenannte „Mehrfachvererbung“. Einfach ausgedrückt, eine bestimmte Klasse in PHP kann nur eine andere Klasse erben (oder erweitern). Nicht mehrere Klassen (einige Sprachen unterstützen dies).
Wenn Sie eine Klasse erweitern, erbt die Unterklasse alle öffentlichen und geschützten Methoden von der übergeordneten Klasse. Sofern eine Klasse diese Methoden nicht überschreibt, behalten sie ihre ursprüngliche Funktionalität bei.
In unserem Beispiel können wir keine andere Klasse wie WrittenDocument einführen, die sowohl von PageDocument als auch von PostDocument erbt. Es ist entweder das eine oder das andere. Und es ist erwähnenswert, dass, wenn es von PostDocument erbt, es auch Informationen von Document erbt, weil es eine Unterklasse einer Unterklasse einer Klasse ist.
4 Polymorphismus
Nachdem wir nun eine grundlegende Definition der Vererbung haben, können wir über Polymorphie sprechen. Die gute Nachricht ist, dass es ein großes, seltsames Wort für ein sehr einfaches Konzept ist.
Die schlechte Nachricht ist, dass wir noch nicht über Schnittstellen oder abstrakte Klassen gesprochen haben. Diese werden kommen, aber sie werden als Teil der vier Säulen betrachtet, also mach dir jetzt keine Sorgen darüber.
Stellen Sie sich stattdessen Folgendes vor:
Polymorphismus ermöglicht es uns, auf eine Klasse eines Typs zu verweisen, wenn sie als ein anderer Typ deklariert werden kann.
Es mag immer noch verwirrend sein, aber erinnern Sie sich an unser, sagen wir, Nachrichtenbeispiel oben? Wir können eine SMSMessage-Klasse instanziieren, die die Message-Klasse erweitert, und dann bestimmte Methoden dafür aufrufen.
Die SMSMessage kann eine Methode haben, die die Message-Klasse hat. Und wenn die Klasse als Instanz der SMSMessage-Klasse instanziiert wurde, ruft sie diese Methode auf. Wenn es keine Methode hat, aber seine übergeordnete Klasse Message eine hat, wird es diese Methode aufrufen.
Manchmal ist es am einfachsten, dies im Code zu verstehen, also machen wir das.
Lassen Sie uns zuerst unsere Message -Klasse definieren:
<?php
class Message
{
public function send()
{
echo "This message is sent from the Message class.n";
}
public function receive()
{
echo "This message was received from the Message class.n";
}
}
Dann definieren wir unsere SMSMessage -Klasse. Beachten Sie, dass es keine Receive()- Funktion hat. Das wird im Moment wichtig sein:
<?php
class SMSMessage extends Message
{
public function send()
{
echo "This message is sent from the SMSMessage class.n";
}
}
Lassen Sie uns nun unsere Message -Klasse instanziieren und einige Methoden aufrufen:
<?php
$message = new Message();
$message->send();
$message->receive();
Und machen wir dasselbe mit der SMSMessage-Klasse:
<?php
$message = new SMSMessage();
$message->send();
$message->receive();
Wenn Sie das gesamte Skript möchten, können Sie es hier sehen, herunterladen und lokal ausführen.
Vererbung, Polymorphismus und WordPress
Hier ist das Fazit (und wir werden darauf näher eingehen, wenn wir uns mit Schnittstellen und abstrakten Klassen befassen): Wenn eine Klasse eine andere Klasse erweitert und nicht über die Implementierungsdetails verfügt, die ihre übergeordnete Klasse hat, wird die Implementierung der übergeordneten Klasse verwendet.
Eine andere Denkweise ist das „Aufarbeiten der Befehlskette“. Es beginnt mit der Klasse, die am niedrigsten ist, was wir erstellt haben. In unserem obigen Beispiel ist das die SMSMessage. Wenn es es dort nicht findet, wird es in die Klasse verschoben, die es erweitert. (Und wenn es dort nicht gefunden wird und diese Klasse eine Klasse erweitert, wird es dort versucht.)
Die ganze polymorphe Sache ist folgende: Wir haben eine Klasse eines Typs, SMSMessage, instanziiert, aber sie verwendet die Implementierung einer Klasse eines anderen Typs (die sie erbt, ja, aber das ist trotzdem anders).
Schreibkurse auf WordPress
Abschließend möchte ich Sie damit belassen: Ich habe etwas Ähnliches im vorherigen Beitrag erwähnt, aber ich möchte es hier wiederholen.
Unabhängig davon, wie viele dieser Konzepte der WordPress-Kern verwendet, spielt es keine Rolle, weil wir hochwertigen, objektorientierten Code auf WordPress schreiben können, der mit WordPress interagiert und der gut mit WordPress (und anderem Code von Drittanbietern – nicht immer) zusammenspielt, aber viele Male).
Was kommt als nächstes?
Als nächstes betrachten wir Schnittstellen und Abstraktionen.
Diese sind immer noch grundlegend für die objektorientierte Programmierung, aber wenn Sie die beiden vorherigen Posts verstanden haben, sind Sie für eine solide Erfahrung mit den kommenden Konzepten gerüstet.
Und wenn nicht, keine Sorge! Sie können jederzeit in den Kommentaren darüber sprechen oder wir können uns per E-Mail weiter darüber unterhalten.