この記事では、チャット フレームワーク開発に関する依存関係注入、コンテナー、外観モード (上部) を主に紹介します。一定の参考値があります。ここで共有します。必要な友人は参考にしてください。
1. 依存関係の注入と切り離し
恋する男女はよく「あなたなしでは生きていけない」と言いますが、これはなんて深い依存なのでしょうか~~
プログラミングにおける依存仕事は本質的に私たちの生活の依存と同じであり、あなたのサポートなしでは私の仕事はできません。あなたなしでは私は存在しません。
依存関係には 2 つのタイプがあります: 1 つは機能的で、もう 1 つは順次的です。例を使用して説明しましょう:
今、このようなタスクがあります:
ユーザー ログイン操作
1. データベース操作、データ検証、テンプレート出力が含まれます;
2. それぞれ Db クラス、Validate クラス、View クラスに対応します;
3. Onlyデモンストレーションと具体的な例は、学生が自分で完了する必要があります。
正式なコーディングの前に、クライアントとは何かを簡単に理解しましょう。
1. クライアント: リクエストを開始できる限り、クライアント、ブラウザ、またはコードの一部とみなすことができます。
2. 次のコードはユーザーをインスタンス化します。クラスを呼び出し、その内部ログオン メソッドが動作します
3。したがって、 $user = new User(); はクライアント コードです
4。または、このように理解することもできます。クラスまたは関数内 コード以外はクライアントとみなすことができます。
ソースコードは次のとおりです:
<?php //数据库操作类 class Db { //数据库连接 public function connect() { return '数据库连接成功<br>'; } } //数据验证类 class Validate { //数据验证 public function check() { return '数据验证成功<br>'; } } //视图图 class View { //内容输出 public function display() { return '用户登录成功'; } } //用户类 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();
上記のコードは正常に動作しますが、次のような問題があります。問題:
1. 上記の 4 つのクラスのうち、User だけが実際の作業クラスであり、他の 3 つはツール クラス (Db、Validate、View)です。
2. ツール クラスが完了すると、ワーク クラスの変更で呼び出される場合、これらのツールを変更する必要がある Db パラメータの変更など、クラスのすべての参照コード
##3. ワーク クラスの呼び出し元は、使用するすべてのツール クラスに精通している必要があります。パラメータと戻り値を理解する必要があります。4 ワーク クラスは、上記の 3 つのツール クラスに深刻な依存関係を形成しており、これはクラス間の深刻な結合とも呼ばれます。結合を切り離すために最も一般的に使用される依存性注入 (DI)#まずは、切り離すという基本的な考え方を理解します:
1. 依存性注入は神聖なものではありません
2. 本質的には, ツールクラスのインスタンス化はワーククラス内で完了するのではなく、ワーククラスの外、つまりクライアント上で完了します
3. ツールクラスのインスタンス化はクライアント上で完了するため、これはワーク クラス内にあり、インスタンス化されたツール オブジェクトを保存するレシーバーが必要です
4。このとき、ユーザーはクライアント上でインスタンス化されたツール オブジェクトをメソッドに直接渡すことができます。ワーク クラスのパラメータの形式での
5. この種のオブジェクトは外部から直接渡されます 現在のワーキング クラスに到達する方法は依存関係の注入と呼ばれます
ソース コードは次のとおりです次のとおりです:
<?php //数据库操作类 class Db { //数据库连接 public function connect() { return '数据库连接成功<br>'; } } //数据验证类 class Validate { //数据验证 public function check() { return '数据验证成功<br>'; } } //视图图 class View { //内容输出 public function display() { return '用户登录成功'; } } //用户类 class User { //创建三个成员属性,用来保存本类所依赖的对象 protected $db = null; protected $validate = null; protected $view = ''; //用户登录操作 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 '<h3>用依赖注入进行解藕:</h3>'; echo $user->login($db, $validate, $view);
依存クラスのインスタンス化はクライアントに進められますが、クラス間の依存関係の問題は解決されています
ただし、まだいくつかの問題があります:
1. 作業クラス User を通常のツールにするには、必要なすべてのクラスを事前に外部でインスタンス化する必要があります;
2 。インスタンス化が関係する限り、クライアント (呼び出し元) は、パラメーターや戻り値など、これらの依存クラスの詳細
ユーザーは依存クラスをインスタンス化する手順を省略することができますか?これはより良くて簡単ではありませんか?
呼び出したとき外部依存クラスの場合、クラスのインスタンスを作成するためにクラス名とメソッド (コンストラクター) を指定するだけで済みますか?
つまり、クラス名とクラスを作成するメソッドのみを指定する必要があります。
#この愚かなデカップリング プロセスを実装するには、「コンテナ テクノロジ」を使用します上記がこの記事の全内容です。お役に立てば幸いです。関連コンテンツの詳細については、PHP 中国語 Web サイトに注目してください。 関連する推奨事項:フレームワーク開発における依存関係注入、コンテナー、および外観パターンについて話しましょう (パート 2)
以上がフレームワーク開発における依存性注入、コンテナ、出現パターンについて話しましょう(前編)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。