★精品文档★
理解php依赖注入和控制反转
要想理解php依赖注入和控制反转两个概念就必须搞清楚如下的问题
DI——Dependency Injection 依赖注入
IoC——Inversion of Control 控制反转
1 、参与者都有谁
答一般有三方参与者一个是某个对象一个是IoC/DI的容器另一个是某个对象的外部资源。又要名词解释一下某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序对象的外部资源指的就是对象需要的但是是从对象外部获取的都统称资源比如对象需要的其它对象、或者是对象需要的文件资源等等。
2、依赖谁依赖于谁为什么会有依赖
答某个对象依赖于IoC/DI的容器。依赖是不可避免的在一个项目中各个类之间有各种各样的关系不可能全部完全独立这就形成了依赖。传统的开发是使用其他类时直接调用这会形成强耦合这是要避免的。依赖注入借用容器转移了被依赖对象实现解耦。
3、注入谁注入于谁到底注入什么
答通过容器向对象注入其所需要的外部资源
4、控制反转谁控制谁控制什么为什么叫反转
1/7
★精品文档★
答 IoC/DI的容器控制对象主要是控制对象实例的创建。反转是相对于正向而言的那么什么算是正向的呢考虑一下常规情况下的应用程序如果要在A里面使用C你会怎么做呢当然是直接去创建C的对象也就是说是在A类中主动去获取所需要的外部资源C这种情况被称为正向的。那么什么是反向呢就是A类不再主动去获取C而是被动等待等待IoC/DI的容器获取一个C的实例然后反向的注入到A类中。
5、依赖注入和控制反转是同一概念吗
答从上面可以看出依赖注入是从应用程序的角度在描述可以把依赖注入描述完整点应用程序依赖容器创建并注入它所需要的外部资源而控制反转是从容器的角度在描述描述完整点容器控制应用程序由容器反向的向应用程序注入应用程序所需要的外部资源。
下面我们通过例子来具体看看依赖注入的一些实现方式
1 .构造器注入
<?phpclass Book{
private$db_conn;
publ ic function__construct($db_conn) {
$this-db_conn=$db_conn;
2/7
★精品文档★
}
}
2、 setter注入
<?phpclass book{
private$db;private$fi le;
function setdb($db){
$this-db=$db;
}
function setfi le($fi le){
$this-fi le=$fi le;
}
}class fi le{}class db{}
. . .class test{
$book=new Book();
$book-setdb(new db());
$book-setfi le(new fi le());
}
3/7
★精品文档★
?
上面俩种方法代码很清晰但是当我们需要注入很多个依赖时意味着又要增加很多行会比较难以管理。
比较好的解决办法是建立一个class作为所有依赖关系的container 在这个class中可以存放、创建、获取、查找需要的依赖关系
<?phpclass Ioc{
protected$db_conn;
publ ic static function make_book() {
$new_book=new Book();
$new_book-set_db(self: :$db_conn);
//. . .
//. . .
//其他的依赖注入
return$new_book;
}
}
此时如果获取一个book实例只需要执行$newone=Ioc: :makebook();
以上是container的一个具体实例最好还是不要把具体的某个依赖注入写成方法采用reg istry注册get获取比较
4/7
★精品文档★
好
<?phpclass Ioc{
**
*@var注册的依赖数组
*/
protected static$registry=array();
/**
*添加一个resolve到registry数组中
*@param string$name依赖标识
*@param object$resolve一个匿名函数用来创建实例
*@return void
*/
publ ic static function register($name,Closure$resolve)
{
static: :$registry[$name]=$resolve;
}
/**
*返回一个实例
*@param string$name依赖的标识
5/7
★精品文档★
*@return mixed
*/
publ ic static function resolve($name)
{
if (static: :registered($name) )
{
$name=static: :$registry[$name]; return$name();
}
throw new Exception(‘Nothingregistered with that name, fool . ’);
}
/**
*查询某个依赖实例是否存在
*@param string$name id
*@return bool
*/
publ ic static function registered($name)
{
return array_key_exists($name,static: :$registry);
}
6/7
★精品文档★
}
现在就可以通过如下方式来注册和注入一个
<?php
$book=Ioc: :registry(‘book’ , function(){
$book=new Book;
$book-setdb(‘ . . . ’);
$book-setprice(‘ . . . ’);return$book;
});
//注入依赖
$book=Ioc: :resolve(‘book’);
?
以上就是针对php依赖注入和控制反转的理解希望对大家学习PHP程序设计有所帮助。
7/7
ShockHosting商家在前面文章中有介绍过几次。ShockHosting商家成立于2013年的美国主机商,目前主要提供虚拟主机、VPS主机、独立服务器和域名注册等综合IDC业务,现有美国洛杉矶、新泽西、芝加哥、达拉斯、荷兰阿姆斯特丹、英国和澳大利亚悉尼七大数据中心。这次有新增日本东京机房。而且同时有推出5折优惠促销,而且即刻使用支付宝下单的话还可获赠10美金的账户信用额度,折扣相比之前的常规...
Justg是一家俄罗斯VPS云服务器提供商,主要提供南非地区的VPS服务器产品,CN2高质量线路网络,100Mbps带宽,自带一个IPv4和8个IPv6,线路质量还不错,主要是用户较少,带宽使用率不高,比较空闲,不拥挤,比较适合面向非洲、欧美的用户业务需求,也适合追求速度快又需要冷门的朋友。justg的俄罗斯VPS云服务器位于莫斯科机房,到美国和中国速度都非常不错,到欧洲的平均延迟时间为40毫秒,...
PQ.hosting怎么样?PQ.hosting是一家俄罗斯商家,正规公司,主要提供KVM VPS和独立服务器,VPS数据中心有香港HE、俄罗斯莫斯科DataPro、乌克兰VOLIA、拉脱维亚、荷兰Serverius、摩尔多瓦Alexhost、德国等。部分配置有变化,同时开通Paypal付款。香港、乌克兰、德国、斯洛伐克、捷克等为NVMe硬盘。香港为HE线路,三网绕美(不太建议香港)。免费支持wi...