PHP依赖注入容器怎样理解?浅谈依赖注入容器
Admin 2021-05-24 群英技术资讯 1235 次浏览
文本主要给大家分享的是关于php依赖注入容器的内容,对于新手来说依赖注入容器可能比较难理解,文本有对依赖注入容器理解以及具体代码,有这方面学习需要的朋友可以参考参考。下面我们一起来了解一下。
依赖注入容器理解
耦合
一个好的代码结构设计一定是松耦合的,这也是很多通用设计模式的宗旨,就是把分散在各处的同一个功能的代码汇聚到一起,形成一个模块,然后在不同模块之间通过一些细小的、明确的渠道进行沟通。
在实践中,不同功能和模块之间的互相依赖是不可避免的,而如何处理好这些依赖之间的关系则是代码结构能否变得美好的关键。
<?php class User { public function register($user) { // 注册操作 ... // 发送确认邮件 $notify = new Notify(); $notify->sendEmail('register', $user); } } class Notify { public function sendEmail($type, $data) { switch $type { case 'register': // 发送注册确认邮件 $email = new Email($type); $email->send($data); ... } } } class Email { public function send($data) { // 发送邮件 } }
上述代码中,三个类之间逐层依赖,三个类实例化的顺序是 User -> Notify -> Email
也就是说我先实例化User类,可能执行了一些代码之后再去实例化我需要的其他类,比如Notify,以此类推。
这种依赖会让我们不得不为了得到需要的依赖而去做的一些准备工作,有时候可能一个new操作还不够。而这部分工作就是所说的耦合,他会让一个独立功能的类不得不去关心一些和自己的主体功能没什么关系的操作。
解除一个类对其他类的依赖
要解决这个问题也很简单,我可以先实例化好Email类,然后再实例化Notify,然后把Email对象作为参数传给Notify,最后实例化User类,然后把Notify传进去。这就是所谓的依赖注入,可以看到这个过程中类实例化的顺序完全反过来了,先实例化被依赖的对象,而不是先实例化最终需要的对象,这是控制反转。
代码如下:
<?php $email = new Email(); $notify = new Notify($email); $user = new User($notify);
可以通过构造函数来注入需要的依赖,也可以用一些其他的方法。
用容器托管依赖
那又有新的问题,例子中只有三个类还好,那如果这个User类依赖Notify来发邮件,依赖Model来存数据库,依赖redis来缓存,这样固然把依赖关系转移到了类的外部,但还是会导致我只想实例化一下User的时候,却要手动做很多的准备工作,会让代码混乱。所以这个时候需要一个容器。而这个容器的作用就是替我来管理这些依赖。
<?php // 容器 class Container implements ArrayAccess { protected $values = []; public function offsetGet($offset) { return $this->values[$offset]($this); } public function offsetSet($offset, $value) { $this->values[$offset] = $value; } }
在程序启动的时候,我们可以在一个地方统一的注册好一系列的基础服务。
<?php $container = new Container(); $container['notify'] = function($c) { return new Notify(); }; $container['email'] = function($c) { return new Email(); };
就会变成这样
<?php class User { public function register($user) { // 注册操作 ... // 发送确认邮件 $container('notify')->sendEmail('register', $user); } } class Notify { public function sendEmail($type, $data) { switch $type { case 'register': // 发送注册确认邮件 $email = $container['email']; $email->send($data); ... } } } class Email { public function send($data) { // 发送邮件 } }
就是当User需要Notify的时候,会去向容器要这个类的对象,那至于Notify再依赖什么其他的东西,我就不用管了,因为Notify也会去向容器要它自己需要的依赖。所有这些依赖关系的处理就完全托管给容器了,我们既不需要去关心依赖之间的层次关系,也避免了依赖之间的耦合。
需要注意的是,依赖注入容器一般只接受一个匿名函数,而不是一个实例化好的对象,匿名函数会告诉容器怎样去获得一个对象,这样可以使得一个服务在被需要的时候才会去实例化
关于php依赖注入容器的介绍就到这,希望大家阅读完这篇文章能有所收获,想要更深入了解依赖注入容器,大家可以关注其他相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
问题描述碰到这么一个问题:IIS上跑PHP,已经在IIS中添加FastCGI模块映射。当IIS的应用程序池配置为DefaultAppPool时执行phpinfo()正常。
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
Error 和 Logging 函数是 PHP 核心的组成部分,它们无需安装即可使用。
php7比5快的原因:1、减少变量存储字节,减少内存占用,提高变量运行速度。2、改进数组结构,减少存储器的占用,提高cpu缓存的命中率。3、改进函数调用机制,通过优化参数传递环节,减少部分指令,提高执行效率。
抽象工厂模式是一种创建型模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。它的实质是“提供接口,创建一系列相关或独立的对象,而不指定这些对象...
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008