您好,欢迎访问一九零五行业门户网

PHP依赖倒置(Dependency Injection)代码实例,依赖倒置原则_PHP教程

php依赖倒置(dependency injection)代码实例,依赖倒置原则实现类:
复制代码 代码如下:
class container
{
    protected $setings = array();
public function set($abstract, $concrete = null)
    {
        if ($concrete === null) {
            $concrete = $abstract;
        }
$this->setings[$abstract] = $concrete;
    }
public function get($abstract, $parameters = array())
    {
        if (!isset($this->setings[$abstract])) {
            return null;
        }
return $this->build($this->setings[$abstract], $parameters);
    }
public function build($concrete, $parameters)
    {
        if ($concrete instanceof closure) {
            return $concrete($this, $parameters);
        }
$reflector = new reflectionclass($concrete);
if (!$reflector->isinstantiable()) {
            throw new exception(class {$concrete} is not instantiable);
        }
$constructor = $reflector->getconstructor();
if (is_null($constructor)) {
            return $reflector->newinstance();
        }
$parameters = $constructor->getparameters();
        $dependencies = $this->getdependencies($parameters);
return $reflector->newinstanceargs($dependencies);
    }
public function getdependencies($parameters)
    {
        $dependencies = array();
        foreach ($parameters as $parameter) {
            $dependency = $parameter->getclass();
            if ($dependency === null) {
                if ($parameter->isdefaultvalueavailable()) {
                    $dependencies[] = $parameter->getdefaultvalue();
                } else {
                    throw new exception(can not be resolve class dependency {$parameter->name});
                }
            } else {
                $dependencies[] = $this->get($dependency->name);
            }
        }
return $dependencies;
    }
}
实现实例:
复制代码 代码如下:
require 'container.php';
interface myinterface{}
class foo implements myinterface{}
class bar implements myinterface{}
class baz
{
    public function __construct(myinterface $foo)
    {
        $this->foo = $foo;
    }
}
$container = new container();
$container->set('baz', 'baz');
$container->set('myinterface', 'foo');
$baz = $container->get('baz');
print_r($baz);
$container->set('myinterface', 'bar');
$baz = $container->get('baz');
print_r($baz);
依赖注入是为何
依赖注入和控制反转是同义词,已合并。控制反转(inversion of control,英文缩写为ioc)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(dependency injection)。简称di。
起源
早在2004年,martin fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了。基于这个结论,他为创造了控制反转一个更好的名字:依赖注入。许多非凡的应用(比helloworld.java更加优美,更加复杂)都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要,与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么如你所见,这将导致代码高度耦合并且难以测试。 ioc 亦称为 “依赖倒置原理”(dependency inversion principle)。差不多所有框架都使用了“倒置注入(fowler 2004)技巧,这可说是ioc原理的一项应用。smalltalk,c++, java 或各种.net 语言等面向对象程序语言的程序员已使用了这些原理。 控制反转是spring框架的核心。 应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
编辑本段ioc是设计模式
ioc就是ioc,不是什么技术,与gof一样,是一种设计模式。 interface driven design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:ainterface a = new ainterfaceimp(); 这样一来,耦合关系就产生了,如: class a { ainterface a; a() { } amethod() { a = new ainterfaceimp(); } } classa与ainterfaceimp就是依赖关系,如果想使用ainterface的另外一个实现就需要更改代码了。当然我们可以建立一个factory来根据条件生成想要的ainterface的具体实现,即: interfaceimplfactory { ainterface create(object condition) { if(condition = conda) { return new ainterfaceimpa(); } elseif(condition = condb) { return new ainterfaceimpb(); } else { return new ainterfaceimp(); } } } 表面上是在一定程度上缓解了以上问题,但实质上这种代码耦合并没有改变。通过ioc模式可以彻底解决这种耦合,它把耦合从代码中移出去,放到统一的xml 文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了。 ioc模式,系统中通过引入实现了ioc模式的ioc容器,即可由ioc容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和......余下全文>>
一道面试题:你经常上的技术网站,c#net有什技术网站与开源的项目?
国内 cnblog 51cto csdn
国外
www.asp.net
www.codeproject.com
www.codeplex.com
至于开源项目,51aspx哪能轮得到
大名鼎鼎的nunit, json.net, log4net, lucene.net, paint.net, mono多了去了,看看下面的列表
1.[test] xunit.net - 用于tdd的最好的测试框架之一。
2.[test] rhinomocks mocking framework - 通过创建mock使测试更简单。
3.[test] white for automation of windows applications - 用代码驱动windows程序来测试。
4.[test] gallio automation platform - 可以运行很多测试框架,如mstest、xunit、nunit以及mbunit。
5.[data] fluent nhibernate - fluent nhibernate让你可以用c#代码来设置映射关系。
6.[oop] structuremap dependency injection/inversion of control - 解耦类和依赖。
7.[oop] managed extensibility framework - 从静态编译程序转换到动态语言程序
8.[appfx] s#arp architecture for web applications - 用asp.net mvc和nhibernate快速开发web应用程序。
9.[appfx] openrasta rest based framework for building web applications - 让你的程序拥有一个rest api接口。
10.[appfx] csla.net application framework - .net开发综合框架
11.[appfx] spring.net application framework - web开发综合框架
12.[runtime] mono enables .net on linux and mac - 在linux、bsd和os x上使用.net.
13.[util] sandcastle help file builder - 创建msdn样式的文档。
14.[helper] easyhook for windows api hooking - 用托管代码扩展非托管代码。
15.[helper] json.net for working with json formatted data - 用一条语句序列化.net对象。
16.[helper] excel data reader for excel 97 to 2007 - ......余下全文>>
http://www.bkjia.com/phpjc/892260.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/892260.htmltecharticlephp依赖倒置(dependency injection)代码实例,依赖倒置原则 实现类: 复制代码 代码如下: php class container { protected $setings = array(); public function s...
其它类似信息

推荐信息