就拿我们业务中常用的通知模块来说。
?php * 定义了一个消息类 * Class Message html' target='_blank'>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 Messageinterface Message{ public function seed(); * 有一个发送邮件的类 * Class SeedEmailclass SeedEmail implements Message public function seed() return seed email // TODO: Implement seed() method. *新增一个发送短信的类 * Class SeedSMSclass SeedSMS implements Message public function seed() return seed sms // TODO: Implement seed() method.
$Order = new Order($message);$Order- seed_msg();
这样我们就实现了依赖注入的思路,是不是很方便扩展了。
服务容器我理解的服务容器就是一个自动产生类的工厂。?php * 为了约束我们先定义一个消息接口 * Interface Messageinterface Message{ public function seed(); * 有一个发送邮件的类 * Class SeedEmailclass SeedEmail implements Message public function seed() return seed email // TODO: Implement seed() method. *新增一个发送短信的类 * Class SeedSMSclass SeedSMS implements Message public function seed() return seed sms // TODO: Implement seed() method.
$SMS = $message- make( SMS $SMS- seed();
container是一个简单的服务容器里面有bind,make两个方法
bind是向容器中绑定服务对象。make则是从容器中取出对象。
在bind方法中需要传入一个 concrete 我们可以传入一个实例对象或者是一个闭包函数。
可以看到我这全使用的是闭包函数,其实也可以这样写
$sms = new SeedSMS();$message- bind( SMS ,$sms);
后面这种写法与闭包相比的区别就是我们需要先实例化对象才能往容易中绑定服务。而闭包则是我们使用这个服务的时候才去实例化对象。可以看出闭包是有很多的优势的。
makemake方法就从容器中出去方法。里面首先判断了instances变量中是否有当前以及存在的服务对象,如果有直接返回。如果没有那么会通过 call_user_func_array返回一个对象。call_user_func_array的使用可以查看
PHP 中 call_user_func 的使用
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP !
相关推荐:
PHP容器Pimple运行流程的分析
gitbash PHP执行输出中文乱编解决方式
PHP中常用的数组函数
以上就是PHP中的服务容器与依赖注入的解析的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答