この記事では、単純な依存関係噴射コンテナ(DIコンテナ)PHPパッケージを構築する方法について説明します。 PHPDOCアノテーションや単体テスト(100%コードカバレッジ)を含む記事のすべてのコードは、GitHubリポジトリにアップロードされ、Packagistにリストされています。
キーポイント:
- DIコンテナの構築は、開発者が依存噴射の基本原則とコンテナの作業メカニズムを理解するのに役立ちます。
- diコンテナには、「依存噴射」と「コンテナ」という2つの主な機能があります。コンストラクターインジェクションまたはセッター噴射方法を使用して、インスタンス化してサービスを含める必要があります。
- Symfony依存関係噴射コンテナは、カスタムコンテナを作成するための参照として使用できます。コンテナの構成をパラメーターとサービスに分割し、アプリケーションキーの安全なストレージを可能にします。
- DIコンテナの作成には、プロジェクトディレクトリの作成、
composer.json
ファイルの作成、コンテナの相互運用性インターフェイスの実装が含まれます。また、例外と参照クラスを作成することも含まれます。 - コンテナクラスは、サービスを取得し、サービスが定義されているかどうかを確認する方法、パラメーターの解析、およびサービスの初期化のための方法を含める必要があります。また、円形の参照を防ぐための保護メカニズムも必要です。
依存関係噴射コンテナを計画します最初に、「依存関係噴射コンテナ」を「依存関係噴射」と「コンテナ」という2つの役割に分割します。
依存関係注入の最も一般的に使用される2つの方法は、コンストラクターインジェクションとセッターインジェクション、つまり、コンストラクターパラメーターまたはメソッド呼び出しを介してクラス依存関係を渡すことです。コンテナがインスタンス化してサービスを含めることができる場合、両方の操作を実行できる必要があります。
コンテナになるには、サービスのインスタンスを保存および取得できる必要があります。これは、サービスを作成するのに比べてかなり簡単な作業ですが、それでも検討する価値があります。
パッケージは、コンテナのセットが実装できるインターフェイスを提供します。メインインターフェイスはです。これは、サービスが定義されているかどうかをテストするために、サービスを取得するための2つの方法です。 container-interop
ContainerInterface
interface ContainerInterface { public function get($id); public function has($id); }他の依存関係噴射コンテナを学習します
Symfony依存関係噴射コンテナを使用すると、さまざまな方法でサービスを定義できます。 YAMLでは、コンテナの構成が次のようになる場合があります:
Symfonyは、コンテナの構成をパラメーターとサービスに分割する方法に非常に役立ちます。これにより、APIキー、暗号化キー、認証トークンなどのアプリケーションキーが、ソースコードリポジトリから除外されたパラメーターファイルに保存されます。
parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]PHPでは、Symfony依存関係インジェクションコンポーネントの同じ構成が次のとおりです。
オブジェクトを使用して、
へのメソッド呼び出しで、依存関係の注入ロジックは、この値を直接渡すべきではないことを検出できますが、コンテナ内のサービスIT参照に置き換える必要があります。これにより、混乱なくPHP値やその他のサービスをサービスに簡単に注入できます。use Symfony\Component\DependencyInjection\Reference; // ... $container->setParameter('mailer.transport', 'sendmail'); $container ->register('mailer', 'Mailer') ->addArgument('%mailer.transport%'); $container ->register('newsletter_manager', 'NewsletterManager') ->addMethodCall('setMailer', array(new Reference('mailer')));
setMailer
startReference
最初に、新しいProjectディレクトリを作成し、Composerがクラスを自動的にロードするために使用できるファイルを作成します。現在、このファイルは、SitePointContainer
src
次に、コンテナをコンテナの相互運用性インターフェイスを実装するようにするため、作曲家にそれらをダウンロードして
interface ContainerInterface { public function get($id); public function has($id); }
composer.json
メイン
parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]パッケージは2つの例外インターフェイスも定義します。最初のものは、サービスを作成するときに遭遇する定期的な例外に使用され、要求されたサービスが見つからないときにもう1つが使用されます。また、要求されたパラメーターが見つからない場合、このリストに別の例外を追加します。
ContainerInterface
container-interop
(次のコンテンツでは、記事が長すぎてコアロジックが上記で説明されているため、コードの実装部分が省略されています。GitHubリポジトリの完全なコードには、例外クラス、参照クラス、およびコンテナの完全な実装が含まれています。クラス。)
概要
単純な依存関係噴射コンテナを作成する方法を学びましたが、まだ実装していない強力な機能を備えた他の多くのコンテナがあります!
PHP-DiやAura.diなどの一部の依存関係噴射コンテナは、Auto-Assemblyと呼ばれる機能を提供します。ここでは、コンテナがコンテナ内のどのサービスを他のサービスに注入する必要があるかを推測します。これを行うには、反射APIを使用してコンストラクターパラメーターに関する情報を見つけます。好きなようにリポジトリを導き出し、自動アセンブリのような機能を追加できます。これは素晴らしい演習です!さらに、このコンテナのすべての既知のデリバティブバージョンの公開リストを保持して、他の人があなたがしていることを見ることができるようにします。以下のコメントを使用して作業を共有するだけで、必ず追加してください。
以下のコメントを使用してお問い合わせください。明確にしたり説明したりしたいもの、または見つけたエラーを教えてください。
(コンテンツが上記から非常に複製され、長すぎるため、FAQSセクションは省略されています。)
以上が独自の依存関係噴射コンテナを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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