依赖注入
当A类需求依赖于B类,也就是说需求正在A类中实例化B类的工具来应用时分,假如B类中的性能发作扭转,也会招致A类中应用B类之处也要随着修正,招致A类与B类高耦合。这个时分处理形式是,A类应该去依赖B类的接口,把详细的类的实例化交给内部。
就拿咱们营业中罕用的告诉模块来讲。
惯例
<?php /** * 界说了一个音讯类 * Class Message */ class Message{ public function seed() { return '灰太狼预备吃羊'; } } /* * 定单孕育发生的时分 需求发送音讯 */ class Order{ protected $messager = ''; function __construct() { $this->messager = new Message(); } public function seed_msg() { return $this->messager->seed(); } } $Order = new Order(); echo $Order->seed_msg();
下面的代码是咱们传统的写法。起首由个音讯发送的类。而后正在咱们需求发送音讯之处,挪用发送音讯的接口。有一天你需求增加一个发送短信的接口以餍足没有同的需要。那末你会发现你要再Message类外面做修正。一样也要再Order类外面做修正。这样就显患上很费事。这个时分就有了依赖注入的思绪。
赖注入的思绪
<?php /** * 为了束缚咱们先界说一个音讯接口 * Interface Message */ interface Message{ public function seed(); } /** * 有一个发送邮件的类 * Class SeedEmail */ class SeedEmail implements Message { public function seed() { return '灰太狼发邮件给红太狼说要吃烤全羊'; } } /** *新增一个发送短信的类 * Class SeedSMS */ class SeedSMS implements Message { public function seed() { return '灰太狼发短信给红太狼说要吃烤全羊'; } } /* * 定单孕育发生的时分 需求发送音讯 */ 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); echo $Order->seed_msg(); echo "\n"; //咱们需求发送短信的时分 $message = new SeedSMS(); $Order = new Order($message); echo $Order->seed_msg();
我了解的效劳容器就是一个主动孕育发生类的工场。
效劳容器
<?php /** * 为了束缚咱们先界说一个音讯接口 * Interface Message */ interface Message{ public function seed(); } /** * 有一个发送邮件的类 * Class SeedEmail */ class SeedEmail implements Message { public function seed() { return '灰太狼发邮件给红太狼说要吃烤全羊'; } } /** *新增一个发送短信的类 * Class SeedSMS */ class SeedSMS implements Message { public function seed() { return '灰太狼发短信给红太狼说要吃烤全羊'; } } /** * 这是一个简略的效劳容器 * 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'); echo $SMS->seed(); echo "\n"; $EMAIL = $message->make('EMAIL'); echo $EMAIL->seed();
container是一个简略的效劳容器外面有bind,make两个办法
bind是向容器中绑定效劳工具。
make则是沉着器中掏出工具。
bind
正在bind办法中需求传入一个 concrete 咱们能够传入一个实例工具或许是一个闭包函数。
能够看到我这全应用的是闭包函数,其实也能够这样写
$sms = new SeedSMS(); $message->bind('SMS',$sms);
前面这类写法与闭包相比的区分就是咱们需求先实例化工具能力往容易中绑定效劳。而闭包则是咱们应用这个效劳的时分才去实例化工具。能够看出闭包是有不少的劣势的。
make
make办法就沉着器中进来办法。外面起首判别了instances变量中能否有以后和存正在的效劳工具,假如有间接前往。假如不那末会经过 call_user_func_array前往一个工具。call_user_func_array的应用能够查看
PHP 中 call_user_func 的应用
更多PHP相干技巧文章,请拜访PHP教程栏目进行学习!
以上就是PHP中的相干效劳容器与依赖注入的相干解析的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学 依赖注入 服务容器