php之依赖注入和控制反转,php注入反转
php之依赖注入和控制反转,php注入反转
DI——Dependency Injection 依赖注入
IoC——Inversion of Control 控制反转
要想理解上面两个概念,就必须搞清楚如下的问题:
1、参与者都有谁?
答:一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。又要名词解释一下,某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。
2、依赖:谁依赖于谁?为什么会有依赖?
答:某个对象依赖于IoC/DI的容器。依赖是不可避免的,在一个项目中,各个类之间有各种各样的关系,不可能全部完全独立,这就形成了依赖。传统的开发是使用其他类时直接调用,这会形成强耦合,这是要避免的。依赖注入借用容器转移了被依赖对象实现解耦。
3、注入:谁注入于谁?到底注入什么?
答:通过容器向对象注入其所需要的外部资源
4、控制反转:谁控制谁?控制什么?为什么叫反转?
答: IoC/DI的容器控制对象,主要是控制对象实例的创建。反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。
5、依赖注入和控制反转是同一概念吗?
答:从上面可以看出:依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
下面我们通过例子来具体看看依赖注入的一些实现方式:
1.构造器注入
<?<span>php </span><span>class</span><span> Book { </span><span>private</span> <span>$db_conn</span><span>; </span><span>public</span> <span>function</span> __construct(<span>$db_conn</span><span>) { </span><span>$this</span>->db_conn = <span>$db_conn</span><span>; } }</span>
2、setter注入
<?<span>php<br /> <br />class book{<br /> private $db;<br /> private $file;<br /> function setdb($db){<br /> $this->db=$db;<br /> }<br /> function setfile($file){<br /> $this->file=$file;<br /> }<br />}<br />class file{}<br />class db{}<br />...<br /><br />class test{<br /></span><span> $book</span> = <span>new</span><span> Book(); </span><span>$book</span>->setdb(<span>new db()</span><span>); <br /></span><span> $book->setfile(new file());<br />} </span>?>
上面俩种方法代码很清晰,但是当我们需要注入很多个依赖时,意味着又要增加很多行,会比较难以管理。
比较好的解决办法是 建立一个class作为所有依赖关系的container,在这个class中可以存放、创建、获取、查找需要的依赖关系
<?<span>php </span><span>class</span><span> Ioc { </span><span>protected</span> <span>$db_conn</span><span>; </span><span>public</span> <span>static</span> <span>function</span><span> make_book() { </span><span>$new_book</span> = <span>new</span><span> Book(); </span><span>$new_book</span>->set_db(self::<span>$db_conn</span><span>); </span><span>//</span><span>... //... //其他的依赖注入</span> <span>return</span> <span>$new_book</span><span>; } }</span>
此时,如果获取一个book实例,只需要执行$newone = Ioc::makebook();
以上是container的一个具体实例,最好还是不要把具体的某个依赖注入写成方法,采用registry注册,get获取比较好
<?<span>php </span><span>class</span><span> Ioc { </span><span>/*</span><span>* * @var 注册的依赖数组 </span><span>*/</span> <span>protected</span> <span>static</span> <span>$registry</span> = <span>array</span><span>(); </span><span>/*</span><span>* * 添加一个resolve到registry数组中 * @param string $name 依赖标识 * @param object $resolve 一个匿名函数用来创建实例 * @return void </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span> register(<span>$name</span>, Closure <span>$resolve</span><span>) { </span><span>static</span>::<span>$registry</span>[<span>$name</span>] = <span>$resolve</span><span>; } </span><span>/*</span><span>* * 返回一个实例 * @param string $name 依赖的标识 * @return mixed </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span> resolve(<span>$name</span><span>) { </span><span>if</span> ( <span>static</span>::registered(<span>$name</span><span>) ) { </span><span>$name</span> = <span>static</span>::<span>$registry</span>[<span>$name</span><span>]; </span><span>return</span> <span>$name</span><span>(); } </span><span>throw</span> <span>new</span> <span>Exception</span>('Nothing registered with that name, fool.'<span>); } </span><span>/*</span><span>* * 查询某个依赖实例是否存在 * @param string $name id * @return bool </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span> registered(<span>$name</span><span>) { </span><span>return</span> <span>array_key_exists</span>(<span>$name</span>, <span>static</span>::<span>$registry</span><span>); } }</span>
现在就可以通过如下方式来注册和注入一个
<?<span>php </span><span>$book</span> = Ioc::registry('book', <span>function</span><span>(){ </span><span>$book</span> = <span>new</span><span> Book; </span><span>$book</span>->setdb('...'<span>); </span><span>$book</span>->setprice('...'<span>); </span><span>return</span> <span>$book</span><span>; }); </span><span>//</span><span>注入依赖</span> <span>$book</span> = Ioc::resolve('book'<span>); </span>?>
参考:http://www.4wei.cn/archives/1002316

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。
