Grundlegendes zur PHP-Dependency-Injection-Container-Serie (2) Was Sie brauchen
Im vorherigen Artikel haben wir einen spezifischen Web-Fall verwendet, um die Abhängigkeitsinjektion zu veranschaulichen. Heute werden wir über den Abhängigkeitsinjektionscontainer (Container) sprechen. Beginnen wir zunächst mit einer wichtigen Aussage:
Big Most of Wenn Sie die Abhängigkeitsinjektion zum Entkoppeln von Komponenten verwenden, benötigen Sie keinen Container.
Aber wenn Sie viele verschiedene Objekte verwalten und mit komplexen Abhängigkeiten zwischen Objekten umgehen möchten, sind Container sehr nützlich.
Erinnern Sie sich an das Beispiel im ersten Artikel? Bevor Sie ein Benutzerobjekt erstellen, müssen Sie zunächst ein SessionStorage-Objekt erstellen. Das ist keine große Sache, aber ich möchte dennoch sagen, dass dies daran liegt, dass Sie die Objekte, von denen es abhängt, genau kennen, bevor Sie das benötigte Objekt erstellen. Wenn es viele Objekte gibt und die Abhängigkeiten kompliziert sind (vorausgesetzt, die SessionStorage-Klasse hängt von der Cache-Klasse ab, die Cache-Klasse hängt von der Dateiklasse und der InputFilter-Klasse ab und die Dateiklasse hängt von der stdio-Klasse ab), dann ist dies der Fall ein Problem. . . .
$storage = new SessionStorage('SESSION_ID'); $user = new User($storage);
In nachfolgenden Artikeln stellen wir vor, wie man Container in Symfony 2 implementiert. Aber um Container einfach und klar zu erklären, lassen wir Symfony vorerst außer Acht. Im Folgenden wird ein Beispiel im Zend Framework zur Veranschaulichung verwendet:
Die Zend_Mail-Klasse von Zend Framework vereinfacht die E-Mail-Verwaltung. Sie verwendet standardmäßig die Funktion mail() von PHP, um E-Mails zu senden, aber ihre Flexibilität ist nicht gut. Glücklicherweise kann dieses Verhalten durch die Bereitstellung einer Transportklasse leicht geändert werden.
Der folgende Code zeigt, wie man die Zend_Mail-Klasse erstellt und ein Gmail-Konto zum Senden von E-Mails verwendet.
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array( 'auth' => 'login', 'username' => 'foo', 'password' => 'bar', 'ssl' => 'ssl', 'port' => 465, )); $mailer = new Zend_Mail(); $mailer->setDefaultTransport($transport);
Der Dependency-Injection-Container ist eine große Klasse, die verschiedene Elemente, die er verwaltet, instanziieren und konfigurieren kann Klassen. Dazu muss es die Parameter und Abhängigkeiten der Konstruktormethoden dieser Klassen kennen.
Das Folgende ist ein hartcodierter Container, der immer noch die zuvor erwähnte Arbeit zum Abrufen des Zend_Mail-Objekts implementiert:
class Container { public function getMailTransport() { return new Zend_Mail_Transport_Smtp('smtp.gmail.com', array( 'auth' => 'login', 'username' => 'foo', 'password' => 'bar', 'ssl' => 'ssl', 'port' => 465, )); } public function getMailer() { $mailer = new Zend_Mail(); $mailer->setDefaultTransport($this->getMailTransport()); return $mailer; } } //容器的使用也很简单 $container = new Container(); $mailer = $container->getMailer();
Wenn Sie den Container verwenden und ein Zend_Mail-Objekt benötigen, tun Sie dies nicht Sie müssen die Details der Erstellung kennen, da alle Details der Erstellung einer Objektinstanz in den Container integriert sind. Die Abhängigkeit von Zend_Mail von der Mail_Transport-Klasse kann auch automatisch über den Container in das Zend_Mail-Objekt eingefügt werden.
Das Abrufen abhängiger Objekte wird hauptsächlich durch getMailTransport() implementiert. Die Leistung des Containers wird durch diesen einfachen Get-Aufruf erreicht.
Aber wenn Sie schlau sind, müssen Sie das Problem entdeckt haben. Der Container enthält harte Codierungen (z. B. die Konto- und Passwortinformationen zum Senden von E-Mails usw.). Wir müssen also noch einen Schritt weiter gehen und dem Container Parameter hinzufügen, um den Container nützlicher zu machen.
class Container { protected $parameters = array(); public function __construct(array $parameters = array()) { $this->parameters = $parameters; } public function getMailTransport() { return new Zend_Mail_Transport_Smtp('smtp.gmail.com', array( 'auth' => 'login', 'username' => $this->parameters['mailer.username'], 'password' => $this->parameters['mailer.password'], 'ssl' => 'ssl', 'port' => 465, )); } public function getMailer() { $mailer = new Zend_Mail(); $mailer->setDefaultTransport($this->getMailTransport()); return $mailer; } }
Jetzt können Sie das Konto und das Passwort zum Senden von E-Mails einfach über die Parameter des Containerkonstruktors ändern
$container = new Container(array( 'mailer.username' => 'foo', 'mailer.password' => 'bar', )); $mailer = $container->getMailer();
Wenn Sie der Meinung sind, dass die Zend_Mail-Klasse die aktuellen Anforderungen nicht erfüllen kann ( B. beim Testen, müssen Sie einige Protokolle erstellen. Wenn Sie die E-Mail-Sendeklasse einfach ändern möchten, können Sie den Klassennamen auch über die Parameter des Containerkonstruktors übergeben.
class Container { // ... public function getMailer() { $class = $this->parameters['mailer.class']; $mailer = new $class(); $mailer->setDefaultTransport($this->getMailTransport()); return $mailer; } } $container = new Container(array( 'mailer.username' => 'foo', 'mailer.password' => 'bar', 'mailer.class' => 'MyTest_Mail', )); $mailer = $container->getMailer();
Abschließend noch eine Überlegung Damit Kunden beim Abrufen des Mailer-Objekts nicht jedes Mal eine neue Instanz erstellen müssen (Overhead), sollte der Container jedes Mal dieselbe Objektinstanz bereitstellen.
Daher verwendet das Programm das geschützte statische Array $shared, um das erste instanziierte Objekt zu speichern. Wenn der Benutzer in Zukunft den Mailer erhält, wird das erste instanziierte Objekt zurückgegeben
class Container { static protected $shared = array(); // ... public function getMailer() { if (isset(self::$shared['mailer'])) { return self::$shared['mailer']; } $class = $this->parameters['mailer.class']; $mailer = new $class(); $mailer->setDefaultTransport($this->getMailTransport()); return self::$shared['mailer'] = $mailer; } }
Container kapseln Zu diesen Grundfunktionen gehört die Instanziierung und Konfiguration von Objekten. Diese Objekte selbst wissen nicht, dass sie vom Container verwaltet werden, und können die Existenz des Containers ignorieren. Aus diesem Grund kann der Container jede beliebige PHP-Klasse verwalten. Es wäre besser, wenn das Objekt selbst die Abhängigkeitsinjektion verwendet, um Abhängigkeiten zu verarbeiten, aber das ist natürlich nicht notwendig.
Aber das Erstellen und Warten von Behältern von Hand kann schnell zum Albtraum werden. Der folgende Artikel beschreibt, wie Symfony 2 Container implementiert.
Das Obige ist, was Sie zum Verständnis der PHP-Abhängigkeitsinjektionscontainerserie (2) benötigen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

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.

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

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 die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.
