您的位置:首页 > 编程语言 > PHP开发

php 依赖注入

2015-12-30 00:00 316 查看
摘要: php中的依赖注入传统的思路是应用程序在用到一个类的时候,就会创建这个类的对象并且调用方法。如果这个方法里面需要一个bar的类,那么就需要new一个bar的对象去进行调用。。。bar类中还需要调用bim的类,那么就还需要new一个bim的类去进行调用。
<?php// 代码【1】classBim{    publicfunctiondoSomething(){        echo__METHOD__, '|';
}
}classBar{    publicfunctiondoSomething(){        $bim = new Bim();        $bim->doSomething();        echo__METHOD__, '|';
}
}classFoo{    publicfunctiondoSomething(){        $bar = new Bar();        $bar->doSomething();        echo__METHOD__;
}
}$foo = new Foo();$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething
使用依赖注入的思路是应用程序中用到foo类,foo类需要用bar类,bar类需要用到bim类。那么先创建bim类,在创建bar类,把bim类注入到bar中,然后创建foo类,将bar注入到foo中。
<?php// 代码【2】class Bim{    public function doSomething(){        echo __METHOD__, '|';}}class Bar{    private $bim;    public function __construct(Bim $bim){        $this->bim = $bim;}    public function doSomething(){        $this->bim->doSomething();        echo __METHOD__, '|';}}class Foo{    private $bar;    public function __construct(Bar $bar){        $this->bar = $bar;}    public function doSomething(){        $this->bar->doSomething();        echo __METHOD__;}}$foo = new Foo(new Bar(new Bim()));$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething
以上代码说的就是控制反转模式。依赖关系的控制反转到调用链的起点。这样就可以完全空值依赖关系,通过调整不同注入对象来控制程序的行为。通过一个最简单的容器类来解释一下,这段代码来自 Twittee
<?phpclass Container{    private $s = array();    function __set($k, $c){        $this->s[$k] = $c;}    function __get($k){        return $this->s[$k]($this);}}
这段代码使用了魔术方法,在给不可访问属性赋值时,__set() 会被调用。读取不可访问属性的值时,__get() 会被调用。
<?php$c = new Container();$c->bim = function () {    return new Bim();};$c->bar = function ($c) {    return new Bar($c->bim);};$c->foo = function ($c) {    return new Foo($c->bar);};// 从容器中取得Foo$foo = $c->foo;$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething
这段代码使用了匿名函数再来一段简单的代码演示一下,容器代码来自simple di container
<?phpclass IoC{    protected static $registry = [];    public static function bind($name, Callable $resolver){        static::$registry[$name] = $resolver;}    public static function make($name){        if (isset(static::$registry[$name])) {            $resolver = static::$registry[$name];            return $resolver();}        throw new Exception('Alias does not exist in the IoC registry.');}}IoC::bind('bim', function () {    return new Bim();});IoC::bind('bar', function () {    return new Bar(IoC::make('bim'));});IoC::bind('foo', function () {    return new Foo(IoC::make('bar'));});// 从容器中取得Foo$foo = IoC::make('foo');$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething
这段代码使用了后期静态绑定

依赖注入容器 (dependency injection container) 高级功能

真实的dependency injection container会提供更多的特性,如自动绑定(Autowiring)或 自动解析(Automatic Resolution)注释解析器(Annotations)延迟注入(Lazy injection)不过说实话 这些东西 没写过。。要写过才知道
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: