検索
ホームページバックエンド開発PHPチュートリアルPHP の依存関係の挿入と制御の反転の解析
PHP の依存関係の挿入と制御の反転の解析Aug 08, 2017 pm 01:55 PM
php逆行するコントロール

この記事では、PHP の依存性注入 (DI) と制御の反転 (IoC) に関する関連情報を主に紹介します。興味のある方は参考にしてください。

まず、依存性の注入と制御の反転について説明します。これも同じで、プログラム間の結合を減らすために使用されるデザイン パターンです。少し調べてみたところ、TP の公式 Web サイトに関連する記事がなかったので、これを紹介するためにこのささやかな記事を書きました。デザインパターンを見て、TP コミュニティに何か貢献できればと思っています。

まず第一に、このデザインパターンの定義を追求しないでください。そうしないと、著者はこれに深く影響を受けており、そのすべてが説明されています。理論的な観点から見ると、Java コードで記述されている語彙も馴染みのないものが多くあります。

何はともあれ、ようやく PHP の観点から依存性注入の概念を説明しましょう。

まず、ここにデータベース接続を使用する必要があるクラスがあると仮定します。最も原始的な方法によれば、このクラスを次のように記述できます。関数には、まずデータベース クラス ファイルを含めます。その後、新しい Db を通じて db クラスをインスタンス化し、データベース接続情報を渡します。その後、getList メソッドは $this->_db を通じてデータベース クラスを呼び出してデータベースを実装します。オペレーション。

目的の機能を達成できたようですが、これは悪夢の始まりです。example1、example2、example3... すべてが記述されると、ますます多くのクラスが db コンポーネントを使用する必要があります。このように、ある日、データベースのパスワードが変更されたり、db クラスが変更されたりした場合、すべてのクラス ファイルに戻って変更する必要があるのではないでしょうか。

この問題を解決するために、Factory メソッドを作成し、Factory::getDb() メソッドを通じて db コンポーネントのインスタンスを取得しました。

class example {
  
  private $_db;
  function __construct(){
    include "./Lib/Db.php";
    $this->_db = new Db("localhost","root","123456","test");
  }
  function getList(){
    $this->_db->query("......");//这里具体sql语句就省略不写了
  }
 }

サンプル クラスは次のようになります。



rreee

これは完璧ですか?今後のすべてのクラス (example1、example2、example3...) についてもう一度考えてみましょう。実際には、コンストラクターの Factory::getDb(); を通じて Db インスタンスを取得する必要があります。この結合は、Factory クラスとの結合になります。ファクトリ クラスは、データベースの接続情報をパッケージ化するのに役立つだけですが、データベース情報が変更されたときは、Factory::getDb() メソッドを変更するだけで済みます。しかし、ある日突然、ファクトリ メソッドが変更されます。名前を変更する必要がある、または getDb メソッドの名前を変更する必要がある場合、どうすればよいでしょうか?もちろん、この種の要求は実際には非常に混乱していますが、場合によってはこのような状況が存在します。 1 つの解決策は次のとおりです。


外部からのインジェクションに依存します。ということですか?次の例を見てください:


class Factory {
  public static function getDb(){
    include "./Lib/Db.php";
    return new Db("localhost","root","123456","test");
  }
 }

このように、サンプル クラスは外部クラスから完全に分離されており、Db クラスにはファクトリ メソッドや Db クラスが存在しないことがわかります。外部からサンプル クラスの setDb メソッドを呼び出して、接続インスタンスを直接挿入します。このように、この例では、db 接続がどのように生成されるかを気にする必要がありません。
これは依存関係注入と呼ばれます。実装はコード内に依存関係を作成しませんが、それをパラメーターとして渡します。これにより、プログラムの保守が容易になり、プログラム コードの結合度が低減され、疎結合が実現されます。

これはまだ終わっていません。サンプル クラスで db に加えて他の外部クラスが使用されていると仮定しましょう。疲れていますか?
わかりました、毎回非常に多くの行のコードを記述する必要がないように、別のファクトリ メソッドを作成しました:


class example {
  
  private $_db;
  function __construct(){
    $this->_db = Factory::getDb();
  }
  function getList(){
    $this->_db->query("......");//这里具体sql语句就省略不写了
  }
 }

例をインスタンス化すると、次のようになります:



class example {
  private $_db;
  function getList(){
    $this->_db->query("......");//这里具体sql语句就省略不写了
  }
  //从外部注入db连接
  function setDb($connection){
    $this->_db = $connection;
  }
 }
 //调用
$example = new example();
$example->setDb(Factory::getDb());//注入db连接
$example->getList();

It完璧に思えますが、上記のファクトリーメソッドを初めて使用したときの状態に戻ったように感じるのはなぜですか?これは確かに良い解決策ではないため、別の概念であるコンテナ (IoC コンテナや DI コンテナとも呼ばれます) が提案されています。


当初は setXXX メソッドを通じてさまざまなクラスを注入していました。コードは非常に長く、多くのメソッドが存在します。ただし、これはあまりクールではありません。setXXX メソッドは必要ありません。そのため、ファクトリ メソッドは必要ありません。 2. パッケージ化したら、依存関係の注入をどのように実装すればよいでしょうか?

ここで規約を紹介します。次のように、例のクラスのコンストラクターに Di $di という名前のパラメーターを渡します。



$example->setDb(Factory::getDb());//注入db连接
$example->setFile(Factory::getFile());//注入文件处理类
$example->setImage(Factory::getImage());//注入Image处理类
 ...

Di は、いわゆるコンテナーであり、さまざまなものを保存します。 Type インスタンスを使用する場合、$di->set() を通じて db という名前のインスタンスを設定します。これはコールバック関数を通じて渡されるため、db クラスは設定されたときにのみインスタンス化されます。 $di->get('db') が実行されるときも同様に、シングルトン モードを di クラスの設計に統合することもできます。


このように、グローバル スコープで Di クラスを宣言し、注入する必要があるすべてのクラスをコンテナーに配置し、そのコンテナーをコンストラクターのパラメーターとして example に渡すだけで済みます。サンプルクラスのコンテナからインスタンスを取得できます。もちろん、コンストラクターである必要はありません。setDi(Di $di) メソッドを使用して Di コンテナーに渡すこともできます。つまり、合意は自分で行うものなので、自分で理解する必要があります。 。

依存性注入と主要なコンテナーの概念が導入されたので、残っているのはそれを実際に使用して理解することだけです。

以上がPHP の依存関係の挿入と制御の反転の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。