美文网首页
php IOC容器的理解

php IOC容器的理解

作者: stormpertel | 来源:发表于2020-01-10 17:27 被阅读0次

依赖注入

依赖注入是指一个类必须依赖另一个实例才能进行实例化。

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就创建好了

相关文章

网友评论

      本文标题:php IOC容器的理解

      本文链接:https://www.haomeiwen.com/subject/awlmactx.html