依赖注入
依赖注入是指一个类必须依赖另一个实例才能进行实例化。
class Boy
{
protected $girl;
public function __construct(Girl $girl) {
$this->girl = $girl;
}
}
class Girl
{
...
}
$boy = new Boy(); //error; boy must have girlfriend
$girl = new Girl();
$boy = new Boy($girl); //right!
进一步利用接口
interface Girl {
...
}
class LoliGirl implement Girl
{
...
}
class Vixen implement Girl
{
...
}
class Boy
{
protected $girl;
public function __construct(Girl $girl) {
$this->girl = $girl;
}
}
$loliGirl = new LoliGirl();
$Vixen = new Vixen();
$boy = new Boy($loliGirl);
$boy = new Boy($Vixen);
升华-IOC容器
class Container
{
protected $binds;
protected $instances;
public function bind($abstract, $concrete) {
if($concrete instanceof Closure) { //判断是否是闭包函数,Closure:代表匿名函数的类
$this->binds[$abstract] = $concrete; //将闭包函数与类名字符串绑定起来
} else {
$this->instances[$abstract] = $concrete;
}
}
public function make($abstract, $parameters = []) {
if(isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
array_unshift($parameters, $this); //将容器$this 插入到$parameters数组的首位
//调用bind绑定的闭包函数,参数为$parameters
return call_user_func_array($this->binds[$abstract], $parameters);
}
}
使用示例
//创建IOC容器
$container = new Container;
//将boy与boy的创建脚本(闭包函数)绑定
$container->bind('boy', function($container, $modulename) {
return new Boy($container->make($modulename));
});
//将loliGirl与loliGirl的创建脚本绑定
$container->bind('loliGirl', function($conntainer) {
return new LoliGirl;
});
//同上
$container->bind('vixen', function($container) {
return new Vixen;
});
//创建boy实例
$boy1 = $container->make('boy', ['loliGirl']);
$boy2 = $container->make('boy', ['vixen']);
//以下为理解说明
//首先在执行三次$container->bind()函数后,得到如下绑定关系
'boy' => function($container, $modulename) {
return new Boy($container->make($modulename));
}
'loliGirl' => function($container) {
return new LoliGirl;
}
'vixen' => function($container) {
return new Vixen;
}
//在创建boy实列时,会执行对应绑定的闭包函数$modulename = ['loliGirl']
//在实例化boy时,需要先执行$container->make($modulename);这将执行与'loliGirl'绑定的闭包函数
//最后,会返回LoliGirl的实例并传入Boy的构造函数,这样实例$boy就创建好了
网友评论