Heim  >  Artikel  >  Backend-Entwicklung  >  Lassen Sie uns über Abhängigkeitsinjektion, Container und Erscheinungsmuster in der Framework-Entwicklung sprechen (Teil 1)

Lassen Sie uns über Abhängigkeitsinjektion, Container und Erscheinungsmuster in der Framework-Entwicklung sprechen (Teil 1)

不言
不言Original
2018-07-14 11:53:231477Durchsuche

Dieser Artikel stellt hauptsächlich die Abhängigkeitsinjektion, den Container und den Erscheinungsmodus (oberer Teil) der Chat-Framework-Entwicklung vor. Jetzt kann ich ihn mit Ihnen teilen

1. Abhängigkeitsinjektion und -entkopplung

Verliebte Männer und Frauen sagen oft: „Ich kann nicht ohne dich leben“~~

Programmierung Die Abhängigkeit in Arbeit ist im Wesentlichen dasselbe wie die Abhängigkeit in unserem Leben: Meine Arbeit kann nicht ohne Ihre Unterstützung erledigt werden.

Es gibt zwei Arten von Abhängigkeiten: eine ist funktional und die andere ist sequenziell. Lassen Sie uns Beispiele zur Veranschaulichung verwenden:

Wir haben jetzt eine solche Aufgabe:

Benutzeranmeldung Operationen

1. Beinhaltet Datenbankoperationen, Datenüberprüfung und Vorlagenausgabe; Es sind Demonstrationen und konkrete Beispiele erforderlich, die die Schüler selbst durchführen können.

Lassen Sie uns vor der formalen Codierung kurz verstehen, was ein Kunde ist.

1. Client: Solange er eine Anfrage initiieren kann, kann er als Client, Browser oder Codeabschnitt betrachtet werden

2 Der folgende Code instanziiert die Benutzerklasse und ruft seine interne Anmeldemethode auf

3. Daher ist $user = new User(); es kann auch so verstanden werden, alles, was in a geschrieben ist Klasse oder Funktion Anders als der Code kann er als Client betrachtet werden

Der Quellcode lautet wie folgt:

<?php 
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return &#39;数据库连接成功<br>&#39;;
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return &#39;数据验证成功<br>&#39;;
}
}
//视图图
class View
{
//内容输出
public function display()
{
return &#39;用户登录成功&#39;;
}
}
//用户类
class User
{
//用户登录操作
public function login()
{
//实例化Db类并调用connect()连接数据库
$db = new Db();
echo $db->connect();
//实例化Validate类并调用check()进行数据验证
$validate = new Validate();
echo $validate->check();
//实例化视图类并调用display()显示运行结果
$view = new View();
echo $view->display();
}
}
//创建User类
$user = new User();
//调用User对象的login方法进行登录操作
echo $user->login();

Obwohl der obige Code normal funktionieren kann, weist er dennoch die folgenden Probleme auf:

1. Von den vier Klassen ist nur User die eigentliche Arbeitsklasse, die anderen drei sind Werkzeugklassen (Db, Validate, View)

2 Sobald die Werkzeugklassen aufgerufen werden Wenn sich die Arbeitsklasse ändert, müssen diese Tools alle Referenzcodes der Klasse geändert werden, z. B. Änderungen der Datenbankparameter.

3 Der Aufrufer der Arbeitsklasse muss mit allen zu verwendenden Werkzeugklassen bestens vertraut sein Verstehen Sie die Parameter und Rückgabewerte

4 . Die Arbeitsklasse hat eine ernsthafte Abhängigkeit von den oben genannten drei Werkzeugklassen gebildet, die auch als ernsthafte Kopplung zwischen Klassen bezeichnet wird

Im Folgenden verwenden wir die am häufigsten verwendeten Abhängigkeitsinjektion (DI) zur Entkopplung

Wir verstehen zunächst die Grundideen der Entkopplung:

1. Abhängigkeitsinjektion ist nicht göttlich

2 Die Klasse wird nicht in der Arbeitsklasse abgeschlossen, sondern außerhalb der Arbeitsklasse, d ein Empfänger sein, um das instanziierte Werkzeugobjekt zu speichern

4 Zu diesem Zeitpunkt kann der Benutzer das auf dem Client instanziierte Werkzeugobjekt in Form von Parametern direkt an die Methode der Arbeitsklasse übergeben

5. Der Weg, die aktuelle Arbeiterklasse zu erreichen, wird als Abhängigkeitsinjektion bezeichnet.

Der Quellcode lautet wie folgt:

<?php
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return &#39;数据库连接成功<br>&#39;;
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return &#39;数据验证成功<br>&#39;;
}
}
//视图图
class View
{
//内容输出
public function display()
{
return &#39;用户登录成功&#39;;
}
}
//用户类
class User
{
//创建三个成员属性,用来保存本类所依赖的对象
protected $db = null;
protected $validate = null;
protected $view = &#39;&#39;;
//用户登录操作
public function login(Db $db, Validate $validate, View $view)
{
//实例化Db类并调用connect()连接数据库
// $db = new Db();
echo $db->connect();
//实例化Validate类并调用check()进行数据验证
// $validate = new Validate();
echo $validate->check();
//实例化视图类并调用display()显示运行结果
// $view = new View();
echo $view->display();
}
}
//在客户端完成工具类的实例化(即工具类实例化前移)
$db = new Db();
$validate = new Validate();
$view = new View();
//创建User类
$user = new User();
//调用User对象的login方法进行登录操作
// echo $user->login();
// 将该类依赖的外部对象以参数方式注入到当前方法中,当然,推荐以构造器方式注入最方便
echo &#39;<h3>用依赖注入进行解藕:</h3>&#39;;
echo $user->login($db, $validate, $view);

Obwohl die Instanziierung abhängiger Klassen auf den Client verschoben wird, ist das Abhängigkeitsproblem zwischen Klassen gelöst

Es gibt jedoch immer noch mehrere Probleme:

1 Als normales Tool müssen alle erforderlichen Klassen im Voraus extern instanziiert werden.

2 . Solange es um die Instanziierung geht, muss der Client (Aufrufer) mit den Details dieser abhängigen Klassen, wie z. B. Parameter und, bestens vertraut sein Rückgabewerte

Kann der Benutzer dann die Schritte zum Instanziieren abhängiger Klassen weglassen? Ist das nicht besser und einfacher?

Wenn wir externe abhängige Klassen aufrufen, müssen wir nur eine Klasse angeben Name und eine Methode (Konstruktor) zum Erstellen einer Instanz der Klasse?

Das heißt: Wir geben nur an: den Klassennamen, die Methode zum Erstellen einer Klasseninstanz und ignorieren den Rest

Jetzt verwenden wir die „Container-Technologie“, um diesen idiotischen Entkopplungsprozess zu implementieren.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein zur chinesischen PHP-Website!

Verwandte Empfehlungen:

Lassen Sie uns über Abhängigkeitsinjektion, Container und Erscheinungsmuster in der Framework-Entwicklung sprechen (Teil 2)

Das obige ist der detaillierte Inhalt vonLassen Sie uns über Abhängigkeitsinjektion, Container und Erscheinungsmuster in der Framework-Entwicklung sprechen (Teil 1). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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