php倒置,PHP依赖倒置(DependencyInjection)代码实例,依赖倒置原则_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...

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值