この記事では、主に PHP のサービス コンテナーと依存関係の注入について紹介します。これは参考になるものです。ここで共有します。必要な友人は参照してください。
<?php /** * 定义了一个消息类 * Class Message */ class Message{ public function seed() { return 'seed email'; } } /* * 订单产生的时候 需要发送消息 */ class Order{ protected $messager = ''; function __construct() { $this->messager = new Message(); } public function seed_msg() { return $this->messager->seed(); } } $Order = new Order(); $Order->seed_msg();
Message クラスを変更する必要があることがわかります。
Order クラスにも変更を加える必要があります。これはとても面倒そうです。このとき、依存性注入というアイデアが生まれました。依存関係注入のアイデアを実現できるように、コード
<?php /** * 为了约束我们先定义一个消息接口 * Interface Message */ interface Message{ public function seed(); } /** * 有一个发送邮件的类 * Class SeedEmail */ class SeedEmail implements Message { public function seed() { return 'seed email'; // TODO: Implement seed() method. } } /** *新增一个发送短信的类 * Class SeedSMS */ class SeedSMS implements Message { public function seed() { return 'seed sms'; // TODO: Implement seed() method. } } /* * 订单产生的时候 需要发送消息 */ class Order{ protected $messager = ''; function __construct(Message $message) { $this->messager = $message; } public function seed_msg() { return $this->messager->seed(); } } //我们需要发送邮件的时候 $message = new SeedEmail(); //将邮件发送对象作为参数传递给Order $Order = new Order($message); $Order->seed_msg(); //我们需要发送短信的时候 $message = new SeedSMS(); $Order = new Order($message); $Order->seed_msg();
<?php /** * 为了约束我们先定义一个消息接口 * Interface Message */ interface Message{ public function seed(); } /** * 有一个发送邮件的类 * Class SeedEmail */ class SeedEmail implements Message { public function seed() { return 'seed email'; // TODO: Implement seed() method. } } /** *新增一个发送短信的类 * Class SeedSMS */ class SeedSMS implements Message { public function seed() { return 'seed sms'; // TODO: Implement seed() method. } } /** * 这是一个简单的服务容器 * Class Container */ class Container { protected $binds; protected $instances; public function bind($abstract, $concrete) { if ($concrete instanceof Closure) { $this->binds[$abstract] = $concrete; } else { $this->instances[$abstract] = $concrete; } } public function make($abstract, $parameters = []) { if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } array_unshift($parameters, $this); return call_user_func_array($this->binds[$abstract], $parameters); } } //创建一个消息工厂 $message = new Container(); //将发送短信注册绑定到工厂里面 $message->bind('SMS',function (){ return new SeedSMS(); }); //将发送邮件注册绑定到工厂 $message->bind('EMAIL',function (){ return new SeedEmail(); }); //需要发送短信的时候 $SMS = $message->make('SMS'); $SMS->seed();ログイン後にコピー
container は、2 つのメソッド
bind と
make
bind を備えた単純なサービス コンテナです。サービス オブジェクトをコンテナにバインドします。
makeはコンテナからオブジェクトを取り出すことです。
bind メソッドでは、
concrete を渡す必要があります。インスタンス オブジェクトまたはクロージャ関数を渡すことができます。
クロージャ関数を使用していることがわかります。実際、このように書くこともできます
$sms = new SeedSMS(); $message->bind('SMS',$sms);
makeメソッドはコンテナを終了するメソッドです。まず、
instances 変数に現在および既存のサービス オブジェクトがあるかどうかを判断し、存在する場合は直接返します。そうでない場合は、
call_user_func_array を通じてオブジェクトが返されます。
call_user_func_array の使い方については、PHP での
call_user_func の使い方を確認してください
gitbash PHP 実行の中国語ランダム コーディングの解決策出力
以上がPHP でのサービス コンテナーと依存関係注入の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。