In dieser Serie werde ich die Grundlagen der objektorientierten PHP-Programmierung (OOP) behandeln. Der Inhalt wird in aufeinanderfolgende Teile gegliedert, die sich jeweils auf ein bestimmtes Thema konzentrieren. Wenn Sie ein Anfänger sind oder mit OOP-Konzepten nicht vertraut sind, soll diese Serie Sie Schritt für Schritt anleiten. In diesem Teil werde ich über die Komposition vs. Vererbung und Abhängigkeitsinjektion in PHP diskutieren. Beginnen wir gemeinsam die Reise zum Erlernen von PHP OOP!
Wir haben bereits etwas über die Beziehung zwischen übergeordneten und untergeordneten Klassen in der objektorientierten Programmierung gelernt, wo wir gesehen haben, dass eine untergeordnete Klasse eine übergeordnete Klasse erben und auf alles von dieser aus zugreifen kann. Dies wird als Vererbung bezeichnet.
Auf der anderen Seite bezieht sich Komposition auf die Zuweisung einer übergeordneten Klasse als Eigenschaftswert in der untergeordneten Klasse, anstatt sie zu erben. Dadurch können wir von der übergeordneten Klasse aus auf alles zugreifen. Dies wird als Komposition bezeichnet.
Unten finden Sie Beispiele, die Zusammensetzung und Vererbung veranschaulichen.
class Link { public string $name; public string $type; public function create($name, $type) { $this->name = $name; $this->type = $type; } public function show() { echo "name: $this->name, type: $this->type"; } } // Inheritance example class ShoLink extends Link { // other functionalities } // Composition example class User { public Link $link; public function __construct() { $this->link = new Link(); } // other functionalities } $user = new User(); $user->link->create("Jamir", "Short");
Im ersten Beispiel können wir sehen, dass die ShoLink-Klasse die Link-Klasse erbt. Im zweiten Beispiel hingegen erbt die User-Klasse nicht die Link-Klasse. Stattdessen weist es einer seiner Eigenschaften eine Instanz der Link-Klasse zu. Dadurch können wir in beiden untergeordneten Klassen auf alles aus der Link-Klasse zugreifen.
Nun könnte sich die Frage stellen: Wenn wir bereits über die Vererbung auf alles zugreifen können, warum sollten wir dann Komposition verwenden? Schließlich müssen wir bei der Komposition eine zusätzliche Eigenschaft deklarieren und deren Wert durch die Konstruktion festlegen. Das scheint zusätzliche Arbeit zu sein – welchen Vorteil hat die Verwendung von Kompositionen?
Nun, wir wissen, dass durch Vererbung alles in der übergeordneten Klasse in der untergeordneten Klasse zugänglich gemacht wird. Selbst wenn wir daher bestimmte Methoden der übergeordneten Klasse nicht verwenden möchten oder einige Eigenschaften oder Methoden der übergeordneten Klasse in der untergeordneten Klasse nicht benötigt werden, sind sie dennoch in der untergeordneten Klasse zugänglich, wenn sie öffentliche oder geschützte Mitglieder sind .
Um dieses Problem zu lösen, wird Komposition verwendet. Mit der Komposition können wir in der untergeordneten Klasse nur die erforderlichen Teile der übergeordneten Klasse zugänglich machen. Lassen Sie uns dies anhand eines anderen Beispiels weiter verdeutlichen.
Wenn wir uns die Link-Klasse genau ansehen, können wir sehen, dass sie eine Show-Methode hat. Mit dieser Methode können wir den in der ShoLink-Klasse erstellten Link direkt anzeigen.
Was aber, wenn wir möchten, dass die User-Klasse verhindert, dass jemand den für den Benutzer erstellten Link direkt anzeigt? Stattdessen möchten wir möglicherweise den Link des Benutzers neben seinem Profil anzeigen.
Aus diesem Grund greifen wir in der User-Klasse nicht auf die Link-Klasse, sondern über die Komposition zu. Daher kann niemand den Link des Benutzers direkt über die User-Klasse anzeigen, wohl aber den Link der ShoLink-Klasse.
Jetzt haben wir ein gewisses Verständnis für die Zusammensetzung und wissen, wann wir sie anstelle der Vererbung verwenden sollten, um bestimmte Probleme zu lösen. In OOP gibt es ein Prinzip namens „Komposition gegenüber Vererbung bevorzugen“, was bedeutet, dass der Komposition Vorrang vor der Vererbung eingeräumt wird. Mit anderen Worten, für untergeordnete Klassen, bei denen es nicht notwendig ist, auf alles von der übergeordneten Klasse aus zuzugreifen, sollten wir immer die Komposition der Vererbung vorziehen.
Nun stellt sich die Frage: Wie entscheiden wir, wann wir Komposition und wann Vererbung verwenden?
In diesem Fall müssen wir unsere Entscheidung auf zwei Arten von Beziehungen stützen:
class Link { public string $name; public string $type; public function create($name, $type) { $this->name = $name; $this->type = $type; } public function show() { echo "name: $this->name, type: $this->type"; } } // Inheritance example class ShoLink extends Link { // other functionalities } // Composition example class User { public Link $link; public function __construct() { $this->link = new Link(); } // other functionalities } $user = new User(); $user->link->create("Jamir", "Short");
Wenn Sie sich das Beispiel der ShoLink-Klasse oben ansehen, werden Sie sehen, dass die ShoLink-Klasse von der Link-Klasse erbt. Wenn ich also eine Beziehung zwischen ihnen definieren würde, wäre die Beziehung „ShoLink ist ein Link“, da ShoLink im Wesentlichen eine Art Link ist.
// Inheritance example class ShoLink extends Link { // other functionalities }
Wenn wir uns nun das Beispiel der User-Klasse oben ansehen, können wir sehen, dass die User-Klasse Komposition mit der Link-Klasse verwendet. Wenn ich also eine Beziehung zwischen ihnen definieren würde, wäre die Beziehung „Benutzer hat einen Link“, weil ein Benutzer kein Link ist, aber ein Benutzer kann einen Link haben oder einen besitzen.
Ich hoffe, Sie haben jetzt ein klareres Verständnis von Zusammensetzung und Vererbung, einschließlich der Frage, wann Sie die einzelnen Elemente verwenden und welche in verschiedenen Situationen priorisiert werden sollten.
Bevor wir die Abhängigkeitsinjektion verstehen, müssen wir zunächst verstehen, was eine Abhängigkeit ist. Eine Abhängigkeit liegt vor, wenn eine untergeordnete Klasse die Mitglieder einer anderen Klasse verwendet, entweder durch Vererbung oder Zusammensetzung. In diesem Fall wird die übergeordnete Klasse zur Abhängigkeit der untergeordneten Klasse.
Im obigen Beispiel haben wir gesehen, dass wir, wenn wir Komposition statt Vererbung verwenden, eine Eigenschaft in der untergeordneten Klasse deklarieren und dieser Eigenschaft über den Konstruktor die Instanz der übergeordneten Klasse zuweisen müssen. Wenn wir daher die User-Klasse verwenden möchten, müssen wir die Link-Klasse in ihrem Konstruktor instanziieren, da die User-Klasse von der Link-Klasse abhängig ist. Mit anderen Worten: Die Link-Klasse ist eine Abhängigkeit von der User-Klasse. Das Problem hierbei ist, dass der Instanziierungsprozess der Link-Klasse eng mit der User-Klasse verknüpft ist.
Das Problem besteht darin, dass die Instanziierung der Link-Klasse begrenzt und spezifisch für die Benutzerklasse ist. Wenn wir anstelle der Link-Klasse eine andere Klasse von außen an die User-Klasse übergeben möchten, können wir das nicht tun, da wir explizit die Instanz der Link-Klasse im Konstruktor erstellen und sie der Link-Eigenschaft zuweisen. Dies wird als eng gekoppelte Abhängigkeit bezeichnet, was bedeutet, dass wir diese Abhängigkeit nicht von außen ändern können.
Wenn wir jedoch die Link-Klasse nicht selbst im Konstruktor instanziieren und sie stattdessen dem Benutzer überlassen, was bedeutet, dass ein Benutzer, wenn er unsere Benutzerklasse verwendet, die Link-Klassenabhängigkeit an die Benutzerklasse weitergibt, wird unser Problem sein gelöst.
Sehen wir uns das Codebeispiel unten an.
class Link { public string $name; public string $type; public function create($name, $type) { $this->name = $name; $this->type = $type; } public function show() { echo "name: $this->name, type: $this->type"; } } // Inheritance example class ShoLink extends Link { // other functionalities } // Composition example class User { public Link $link; public function __construct() { $this->link = new Link(); } // other functionalities } $user = new User(); $user->link->create("Jamir", "Short");
In diesem Beispiel können wir sehen, dass wir, anstatt die Link-Klasse im Konstruktor der User-Klasse zu instanziieren, die Abhängigkeit der Link-Klasse von außen an die User-Klasse übergeben. Dieser Prozess der Übergabe der Abhängigkeit an die Benutzerklasse über den Benutzer wird als Abhängigkeitsinjektion bezeichnet. Mit anderen Worten: Wir injizieren oder pushen die Abhängigkeit der Link-Klasse von außen. Dies wird als lose gekoppelte Abhängigkeit bezeichnet, was bedeutet, dass wir diese Abhängigkeit leicht von außen ändern können.
Wenn die Link-Klasse nun auch ihre eigenen Abhängigkeiten hat, können wir diese Abhängigkeiten auch von außen über die User-Klasse in sie einfügen. Dann können wir einfach die Instanz der Link-Klasse in die User-Klasse einfügen. Daher müssen wir uns nicht um die Abhängigkeiten der Link-Klasse innerhalb der User-Klasse kümmern, da der Benutzer dies von außen handhabt.
Sehen wir uns das Codebeispiel unten an.
// Inheritance example class ShoLink extends Link { // other functionalities }
Auf diese Weise können wir so viele Abhängigkeiten von außen einfügen, wie wir möchten, und es wird viel flexibler. Das ist alles für heute; wir reden in der nächsten Lektion.
Sie können sich mit mir auf GitHub und Linkedin verbinden.
Das obige ist der detaillierte Inhalt vonPHP-OOP-Teilzusammensetzung vs. Vererbungs- und Abhängigkeitsinjektion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!