php依赖注入对象注册(php依赖注入知识点详解)
类别:编程学习 浏览量:2219
时间:2021-10-22 07:08:56 php依赖注入对象注册
php依赖注入知识点详解引言
你知道什么是依赖注入吗?依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的php框架的话,对于DI一定不陌生,因
为它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。
php中传递依赖关系的三种方案
其实要理解DI,首先要明白在php中如何传递依赖关系。
第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来创建一个B类,如下代码所示:
|
<?php class A { public function __construct() { $b = new B(); } } |
为什么这种方案不可取呢?因为这样的话,A与B就耦合在了一起,也就是说A类无法脱离B类工作。
第二种方案就是在A类的方法中传入需要的B类
如下代码所示:
|
<?php class A { public function __construct(B $b ) { } } |
这种方法比第一种方案有了改进,A类不必与B类捆绑在一起,只要传入的类满足A类的需求,也可以是C类,也可以是D类等等。但是这
种方案的弊端在于如果A类依赖的类较多,参数列表会很长,容易发生混乱。
第三种方案是使用set方法传入
如下代码所示:
|
<?php class A { public function setB(B $b ) { $this ->b = $b ; } } |
这种方案同样存在和第二种方案一样的弊端,当依赖的类增多时,我们需要些很多很多的set方法。这时我们在想如果有一个专门的类
(或者说一个容器)可以帮我们管理这些依赖关系就好了。
一个简单的依赖注入的例子
如下代码来自twittee:
|
<?php class Container { private $s = array (); function __set( $k , $c ) { $this ->s[ $k ]= $c ; } function __get( $k ) { return $this ->s[ $k ]( $this ); } } |
有了container类之后我们可以怎样管理A与B之间的依赖关系呢,用代码说话吧:
|
<?php class A { private $container ; public function __construct(Container $container ) { $this ->container = $container ; } public function doSomeThing() { //do something which needs class B $b = $this ->container->getB(); //to do } } |
再将B类注入到容器类中:
|
$c = new Container(); $c ->setB( new B()); |
还可以传入一个匿名函数,这样B类就不会在传入时就立即实例化,而是在真正调用时才完成实例化的工作
|
$c = new Container(); $c ->setB( function (){ return new B(); }); |
这里举的只是一个很简单的例子,在实际中,容器类要考虑的有很多,比如延迟加载等等。
以上内容仅供参考!感谢大家的学习和对开心学习网的支持。
原文链接:https://www.php.cn/php-ask-430664.html
您可能感兴趣
- php可忽略大小写的模式符(PHP基于timestamp和nonce实现的防止重放攻击方案分析)
- phpstudy怎么配置php环境(使用phpStudy搭建php环境及安装各种php程序实战教程)
- dedecms标签调用原理(DEDECMS安全设置 执行php脚本限制设置方法apache+nginx)
- php7用什么替代mysql(mysqli扩展无法在PHP7下升级问题的解决)
- phpstudy的mysql无法启动(Windows系统下解决PhPStudy MySQL启动失败问题)
- php性能比较(php使用yield对性能提升的测试实例分析)
- php怎么设计策略模式(php设计模式之策略模式应用案例详解)
- thinkphp5.1 执行流程(Thinkphp5.0 框架的请求方式与响应方式分析)
- phpredis高级用法(PHP Redis扩展无法加载的问题解决方法)
- php类的属性和方法(PHP进阶学习之反射基本概念与用法分析)
- php闰年计算公式(php判断/计算闰年的方法小结三种方法)
- php中把字符串分开的函数(PHP字符串中抽取子串操作实例分析)
- php7.4 废弃功能(浅析PHP7 的垃圾回收机制)
- php大量数据计算有什么技巧(PHP各种常见经典算法总结排序、查找、翻转等)
- php 十六进制转换为二进制(PHP实现的62进制转10进制,10进制转62进制函数示例)
- php编写程序使用方法(php xhprof使用实例详解)
- 景区游玩,这些安全知识要牢记(这些安全知识要牢记)
- 各地出招烘 热 旅游(各地出招烘热旅游)
- 2021款起亚霸锐到店了 更换车标,竞争宝马X5有戏吗(2021款起亚霸锐到店了)
- 新款起亚霸锐实拍,比普拉多气派,配3.0T V6,引入国内或许能大卖(新款起亚霸锐实拍)
- ()
- 张勇 阿里新任掌门人(阿里新任掌门人)
热门推荐
- jquerycss3轮播案例(CSS3实现列表无限滚动/轮播效果)
- php技术优点和缺点(php的优点总结 php有哪些优点)
- VPS搭建离线下载服务器(后网盘时代)(VPS搭建离线下载服务器后网盘时代)
- mysql各种备份方式(MySQL 逻辑备份与恢复测试的相关总结)
- python列表精讲33节(Python列表知识应知应会)
- 个人组建云服务器(个人云服务器搭建图文教程)
- 面试时问期望工资怎么回答
- html5视频播放代码详解(HTML5基于flash实现播放RTMP协议视频的示例代码)
- docker下怎么搭建一个php环境(Docker搭建php环境教程详解)
- 什么是web服务器(什么是网站服务器?服务器是做什么用的?)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9