Heim Backend-Entwicklung PHP-Tutorial Warum verwendet PHP die Abhängigkeitsinjektion?

Warum verwendet PHP die Abhängigkeitsinjektion?

May 18, 2019 pm 01:19 PM
PHP依赖注入

Da die Abhängigkeitsinjektion die Kopplung zwischen der Abhängigkeit und dem abhängigen Typ verringert, ist es beim Ändern der abhängigen Typimplementierung nicht erforderlich, gleichzeitig die abhängige Typimplementierung zu ändern Verwendung für abhängige Typtests „Mocking Object“ ersetzt den ursprünglichen abhängigen Typ, um den Zweck des unabhängigen Unit-Tests abhängiger Objekte zu erreichen.

Warum verwendet PHP die Abhängigkeitsinjektion?

0. Einführung

Im Bereich der Softwareentwicklung wird die Abhängigkeitsinjektion (Dependency Injection) zur Implementierung verwendet Kontrollrückmeldung Eine der gebräuchlichsten Methoden der Kontrollumkehr. In diesem Artikel werden hauptsächlich die Prinzipien und gängigen Implementierungsmethoden der Abhängigkeitsinjektion vorgestellt, wobei der Schwerpunkt auf den anwendbaren Szenarien und Vorteilen dieses jungen Entwurfsmusters liegt.

1. Warum ist eine Abhängigkeitsinjektion erforderlich?

Wer entkoppelt sich? Dies war die erste Frage, die ich hatte, als ich zum ersten Mal etwas über die Abhängigkeitsinjektion erfuhr.

Im Folgenden zitiere ich einen Teil des Codes, den Martin Flower zur Erläuterung der Injektion verwendet hat, um dieses Problem zu veranschaulichen.

public class MovieLister {
    private MovieFinder finder;

    public MovieLister() {
        finder = new MovieFinderImpl();
    }
    
    public Movie[] moviesDirectedBy(String arg) {
        List allMovies = finder.findAll();
        for (Iterator it = allMovies.iterator(); it.hasNext();) {
            Movie movie = (Movie) it.next();
            if (!movie.getDirector().equals(arg)) it.remove();
        }
        return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
    }
    ...
}
Nach dem Login kopieren
public interface MovieFinder {
    List findAll();
}
Nach dem Login kopieren

Wir haben eine Klasse namens MovieLister erstellt, um die erforderliche Filmliste bereitzustellen, und ihre moviesDirectedBy-Methode bietet eine Möglichkeit, nach Filmen basierend auf Regisseurnamen zu suchen. Was wirklich für die Suche nach Filmen verantwortlich ist, ist MovieFinderImpl, das die MovieFinder-Schnittstelle implementiert. Unsere MovieLister-Klasse erstellt ein MovieFinderImpl-Objekt im Konstruktor.

Bis jetzt sieht alles gut aus. Wenn wir jedoch den Finder ändern und durch eine neue Implementierung ersetzen möchten (z. B. das Hinzufügen eines Parameters zu MovieFinder, um anzugeben, aus welcher Datenbank die Filmdaten stammen), müssen wir nicht nur die MovieFinderImpl-Klasse ändern, sondern auch Ändern Sie das in unserem MovieLister-Code erstellte MovieFinderImpl.

Dies ist die Kopplung, mit der sich die Abhängigkeitsinjektion befasst. Durch diese Art der Erstellung von MovieFinderImpl in MovieLister ist MovieLister nicht nur auf die MovieFinder-Schnittstelle angewiesen, sondern auch auf die Implementierung von MovieListImpl. Diese Art von Code, der Objekte einer anderen Klasse direkt in einer Klasse erstellt, wie z. B. fest codierte Zeichenfolgen und fest codierte Zahlen (magische Zahlen), ist ein schlechter Geruch, der zur Kopplung führt. Wir können diesen schlechten Geruch als harte Init bezeichnen . Gleichzeitig sollten wir uns ebenso wie hartes Codieren daran erinnern, dass Neues (Objekterstellung) giftig ist.

Die Hauptnachteile von Hard Init sind zwei Aspekte: 1) Wenn Sie die Implementierung wie oben erwähnt ändern, müssen Sie den Code dort ändern, wo er erstellt wurde. 2) Es ist nicht einfach zu testen, und die Klassen sind nicht einfach Der auf diese Weise erstellte (oben) MovieLister in diesem Artikel) kann nicht alleine getestet werden und sein Verhalten ist eng mit MovieFinderImpl verknüpft. Gleichzeitig führt dies auch zu Problemen bei der Lesbarkeit des Codes („Wenn ein Code nicht einfach zu testen ist , dann muss es nicht leicht lesbar sein.")

2. So implementieren Sie die Abhängigkeitsinjektion

Abhängigkeitsinjektion wird in vielen unserer täglichen Codes verwendet, aber wir bemerken sie selten. und nutzen die Abhängigkeitsinjektion selten aktiv zur Entkopplung. Hier stellen wir kurz die drei Methoden vor, mit denen man sich auf die Injektion verlassen kann.

2.1 Konstruktorinjektion

Dies ist meiner Meinung nach die einfachste Abhängigkeitsinjektionsmethode. Ändern wir den Konstruktor von MovieList im obigen Code, sodass die Implementierung von MovieFinderImpl in der außerhalb erstellten MovieLister-Klasse erfolgt. Auf diese Weise hängt MovieLister nur von der von uns definierten MovieFinder-Schnittstelle ab, nicht von der Implementierung von MovieFinder.

public class MovieLister {
    private MovieFinder finder;

    public MovieLister(MovieFinder finder) {
        this.finder = finder;
    }
    ...
}
Nach dem Login kopieren

2.2 Setter-Injection

Ähnlich können wir eine Setter-Funktion hinzufügen, um das erstellte MovieFinder-Objekt zu übergeben, wodurch auch eine harte Initialisierung dieses Objekts in MovieFinder vermieden werden kann.

public class MovieLister {
    s...
    public void setFinder(MovieFinder finder) {
        this.finder = finder;
    }
}
Nach dem Login kopieren

2.3 Schnittstelleninjektion

Schnittstelleninjektion verwendet die Schnittstelle, um die Setter-Methode bereitzustellen, und ihre Implementierung ist wie folgt.

Erstellen Sie zunächst eine Schnittstelle für die Injektion.

public interface InjectFinder {
    void injectFinder(MovieFinder finder);
}
Nach dem Login kopieren

Danach lassen wir MovieLister diese Schnittstelle implementieren.

class MovieLister implements InjectFinder {
    ...
    public void injectFinder(MovieFinder finder) {
      this.finder = finder;
    }
    ...
}
Nach dem Login kopieren

Schließlich müssen wir abhängige MovieFinder-Implementierungen gemäß verschiedenen Frameworks erstellen.

3. Abschließend

Abhängigkeitsinjektion reduziert die Kopplung zwischen Abhängigkeiten und abhängigen Typen. Es besteht keine Notwendigkeit, die Implementierung von zu ändern Gleichzeitig ist es für abhängige Typtests bequemer, den ursprünglichen abhängigen Typ durch ein Spottobjekt zu ersetzen, um den Zweck des unabhängigen Komponententests abhängiger Objekte zu erreichen.

Abschließend sei darauf hingewiesen, dass die Abhängigkeitsinjektion nur eine Möglichkeit ist, die Umkehrung der Kontrolle zu implementieren. Eine weitere gängige Implementierung der Kontrollumkehr ist die sogenannte Abhängigkeitssuche.

Das obige ist der detaillierte Inhalt vonWarum verwendet PHP die 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Erklären Sie das Konzept der späten statischen Bindung in PHP. Erklären Sie das Konzept der späten statischen Bindung in PHP. Mar 21, 2025 pm 01:33 PM

In Artikel wird die in PHP 5.3 eingeführte LSB -Bindung (LSB) erörtert, die die Laufzeitauflösung der statischen Methode ermöglicht, um eine flexiblere Vererbung zu erfordern. Die praktischen Anwendungen und potenziellen Perfo von LSB

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.

Rahmensicherheitsmerkmale: Schutz vor Schwachstellen. Rahmensicherheitsmerkmale: Schutz vor Schwachstellen. Mar 28, 2025 pm 05:11 PM

In Artikel werden wichtige Sicherheitsfunktionen in Frameworks erörtert, um vor Schwachstellen zu schützen, einschließlich Eingabevalidierung, Authentifizierung und regelmäßigen Aktualisierungen.

Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Mar 28, 2025 pm 05:12 PM

In dem Artikel werden Frameworks hinzugefügt, das sich auf das Verständnis der Architektur, das Identifizieren von Erweiterungspunkten und Best Practices für die Integration und Debuggierung hinzufügen.

Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Apr 01, 2025 pm 03:12 PM

Senden von JSON -Daten mithilfe der Curl -Bibliothek von PHP in der PHP -Entwicklung müssen häufig mit externen APIs interagieren. Eine der gängigen Möglichkeiten besteht darin, die Curl Library zu verwenden, um Post � ...

See all articles