Home > php教程 > php手册 > body text

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

WBOY
Release: 2016-06-13 09:24:11
Original
1189 people have browsed it

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 - ......余下全文>>
 

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template