Heim Backend-Entwicklung PHP-Tutorial PHP-OOP-Teilzusammensetzung vs. Vererbungs- und Abhängigkeitsinjektion

PHP-OOP-Teilzusammensetzung vs. Vererbungs- und Abhängigkeitsinjektion

Jan 05, 2025 am 12:14 AM

PHP OOP Part-Composition vs Inheritance and Dependency Injection

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!

Zusammensetzung vs. Vererbung

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.

Codebeispiel

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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.

Bevorzugen Sie die Zusammensetzung gegenüber der Vererbung

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:

  1. ist ein -> Beziehung. Wenn die Beziehung „ist ein“ ist, sollten wir die Vererbung verwenden.
  2. hat ein -> Beziehung. Wenn die Beziehung „hat ein“ lautet, sollten wir Komposition verwenden.

Codebeispiel

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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.

Codebeispiel

// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}
Nach dem Login kopieren
Nach dem Login kopieren

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.

Abhängigkeitsinjektion

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.

Codebeispiel

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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.

Codebeispiel

// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}
Nach dem Login kopieren
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1653
14
PHP-Tutorial
1251
29
C#-Tutorial
1224
24
Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Was sind Aufzählungen (Enums) in PHP 8.1? Was sind Aufzählungen (Enums) in PHP 8.1? Apr 03, 2025 am 12:05 AM

Die Aufzählungsfunktion in Php8.1 verbessert die Klarheit und Type des Codes, indem benannte Konstanten definiert werden. 1) Aufzählungen können Ganzzahlen, Zeichenfolgen oder Objekte sein, die die Lesbarkeit der Code und die Type der Type verbessern. 2) Die Aufzählung basiert auf der Klasse und unterstützt objektorientierte Merkmale wie Traversal und Reflexion. 3) Die Aufzählung kann zum Vergleich und zur Zuordnung verwendet werden, um die Sicherheit der Typ zu gewährleisten. 4) Aufzählung unterstützt das Hinzufügen von Methoden zur Implementierung einer komplexen Logik. 5) Strenge Typ Überprüfung und Fehlerbehandlung können häufig auftretende Fehler vermeiden. 6) Die Aufzählung verringert den magischen Wert und verbessert die Wartbarkeit, achten Sie jedoch auf die Leistungsoptimierung.

Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Apr 03, 2025 am 12:04 AM

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Apr 06, 2025 am 12:02 AM

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind REST -API -Designprinzipien? Was sind REST -API -Designprinzipien? Apr 04, 2025 am 12:01 AM

Die RESTAPI -Designprinzipien umfassen Ressourcendefinition, URI -Design, HTTP -Methodenverbrauch, Statuscode -Nutzung, Versionskontrolle und Hassoas. 1. Ressourcen sollten durch Substantive dargestellt und in einer Hierarchie aufrechterhalten werden. 2. HTTP -Methoden sollten ihrer Semantik entsprechen, z. B. Get wird verwendet, um Ressourcen zu erhalten. 3. Der Statuscode sollte korrekt verwendet werden, z. B. 404 bedeutet, dass die Ressource nicht vorhanden ist. 4. Die Versionskontrolle kann über URI oder Header implementiert werden. 5. Hateoas startet Client -Operationen durch Links als Antwort.

Wie können Sie mit Ausnahmen in PHP effektiv umgehen (versuchen Sie, schließlich zu werfen)? Wie können Sie mit Ausnahmen in PHP effektiv umgehen (versuchen Sie, schließlich zu werfen)? Apr 05, 2025 am 12:03 AM

In PHP wird das Ausnahmebehandlung durch den Versuch, Fang, schließlich und werfen Keywords erreicht. 1) Der Try -Block umgibt den Code, der Ausnahmen auslösen kann. 2) Der Catch -Block behandelt Ausnahmen; 3) Block stellt schließlich sicher, dass der Code immer ausgeführt wird. 4) Wurf wird verwendet, um Ausnahmen manuell zu werfen. Diese Mechanismen verbessern die Robustheit und Wartbarkeit Ihres Codes.

Was sind anonyme Klassen in PHP und wann könnten Sie sie verwenden? Was sind anonyme Klassen in PHP und wann könnten Sie sie verwenden? Apr 04, 2025 am 12:02 AM

Die Hauptfunktion anonymer Klassen in PHP besteht darin, einmalige Objekte zu erstellen. 1. Anonyme Klassen ermöglichen es, Klassen ohne Namen direkt im Code zu definieren, was für vorübergehende Anforderungen geeignet ist. 2. Sie können Klassen erben oder Schnittstellen implementieren, um die Flexibilität zu erhöhen. 3. Achten Sie bei der Verwendung auf Leistung und Code -Lesbarkeit und vermeiden Sie es, dieselben anonymen Klassen wiederholt zu definieren.

See all articles