浅析PHP中服务容器与依赖注入--原文目前流行的PHP容器:PimpleLaravel容器其他依赖注入容器依赖注入当A类需要依赖B类时,也就是说,当B类的一个对象需要在A类中实例化使用时,如果B类中的函数发生变化,也会导致A类中使用B类的地方也相应修改,导致在A类和B类的区别。B类高耦合。这时候的解决办法是A类要依赖B类的接口,把具体类的实例化交给外部。以我们业务中常用的通知模块为例。Generalmessager=newMessage();}publicfunctionseed_msg(){return$this->messager->seed();}}$Order=newOrder();echo$Order->seed_msg();上面的代码是我们传统的写法。消息首先发送的类。然后,在我们需要发送消息的地方,调用发送消息的接口。有一天你会需要添加一个发送短信的接口来满足不同的需求。然后你会发现你需要在Message类中进行更改。还需要在Order类中进行更改。这看起来很麻烦。这时候就有了依赖注入的想法。赖注入思路messager=$message;}publicfunctionseed_msg(){return$this->messager->seed();}}//当我们需要发送邮件时$message=newSeedEmail();//将邮件发送对象作为参数传递给Order$Order=newOrder($message);echo$Order->seed_msg();echo"\n";//当我们需要发送短信时$message=newSeedSMS();$Order=新订单($message);echo$Order->seed_msg();我理解的服务容器就是一个自动生成类的工厂。服务容器binds[$abstract]=$concrete;}else{$this->instances[$abstract]=$concrete;}}publicfunctionmake($abstract,$parameters=[]){if(isset($this->instances[$abstract])){return$this->instances[$abstract];}array_unshift($parameters,$this);返回call_user_func_ar射线($this->绑定[$抽象],$参数);}}//创建消息工厂$message=newContainer();//将发送短信注册绑定到工厂$message->bind('SMS',function(){returnnewSeedSMS();});//绑定发送邮件注册到工厂$message->bind('EMAIL',function(){returnnewSeedEmail();});//当需要发送短信时$SMS=$message->make('SMS');echo$SMS->seed();echo"\n";$EMAIL=$message->make('EMAIL');echo$EMAIL->seed();container是一个带有bind和make方法的简单服务容器。bind是将服务对象绑定到容器中,make是从容器中取出对象。bind需要在bind方法中传入一个具体的,我们可以传入一个实例对象或者一个闭包函数。你可以看到我只使用了闭包函数。其实也可以这样写$sms=newSeedSMS();$message->bind('SMS',$sms);后一种方法与闭包的不同之处在于,我们需要先实例化对象,然后才能将服务绑定到Easy。闭包就是我们使用这个服务来实例化对象的时候。可见闭包有很多优点。make方法是从容器中取出的方法。它首先判断instances变量中是否存在当前存在的服务对象,存在则直接返回。如果不是,则call_user_func_array将返回一个对象。call_user_func_array的使用可以查看PHP中call_user_func的使用
