当前位置: 首页 > 后端技术 > PHP

PHP中服务容器和依赖注入的思想

时间:2023-03-29 21:42:10 PHP

依赖注入当A类需要依赖B类时,也就是说当B类的一个对象需要在A类中实例化使用时,如果B类中的函数发生变化,也会导致A类中使用B类的地方也相应修改,导致A类和B类的耦合度很高。此时的解决方法是A类应该依赖接口B类的,而将具体类的实例化交给外部。以我们业务中常用的通知模块为例。messager=newMessage();}publicfunctionseed_msg(){return$this->messager->seed();}}$Order=newOrder();$Order->seed_msg();上面的代码是我们传统的写法。消息首先发送的类。然后,在我们需要发送消息的地方,调用发送消息的接口。有一天你会需要添加一个发送短信的接口来满足不同的需求。然后你会发现你需要在Message类中进行更改。还需要在Order类中进行更改。这看起来很麻烦。这时候就有了依赖注入的想法。调整一下下面的代码messager=$message;}publicfunctionseed_msg(){return$this->messager->seed();}}//当我们需要发送邮件时$message=newSeedEmail();//将邮件发送对象作为参数传递给Order$Order=newOrder($message);$Order->seed_msg();//当我们需要发送短信时$message=newSeedSMS();$Order=newOrder($message);$Order->seed_msg();这样我们就实现了依赖注入的思想,是不是很方便扩展呢?我理解的服务容器就是一个自动生成类的工厂。binds[$abstract]=$concrete;}else{$this->instances[$abstract]=$concrete;}}publicfunctionmake($abstract,$parameters=[]){if(isset($this->instances[$abstract])){return$this->instances[$abstract];}大批_unshift($参数,$this);返回call_user_func_array($this->binds[$abstract],$parameters);}}//创建消息工厂$message=newContainer();//发送短信注册绑定到工厂$message->bind('SMS',function(){returnnewSeedSMS();});//绑定发送邮件注册到工厂$message->bind('EMAIL',function(){returnnewSeedEmail();});//当需要发送短信时$SMS=$message->make('短信');$短信->种子();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的使用原文地址