国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP依賴倒置(Dependency Injection)代碼實(shí)例,依賴倒置原則_PHP教程

php中文網(wǎng)
發(fā)布: 2016-07-13 10:17:30
原創(chuàng)
1082人瀏覽過

PHP依賴倒置(Dependency Injection)代碼實(shí)例,依賴倒置原則

實(shí)現(xiàn)類:

復(fù)制代碼 代碼如下:

?
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;
??? }
}

實(shí)現(xiàn)實(shí)例:

復(fù)制代碼 代碼如下:

?
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);

依賴注入是為何

依賴注入和控制反轉(zhuǎn)是同義詞,已合并??刂品崔D(zhuǎn)(Inversion of Control,英文縮寫為IoC)是一個(gè)重要的面向?qū)ο缶幊痰姆▌t來削減計(jì)算機(jī)程序的耦合問題。 控制反轉(zhuǎn)還有一個(gè)名字叫做依賴注入(Dependency Injection)。簡稱DI。
起源
  早在2004年,Martin Fowler就提出了“哪些方面的控制被反轉(zhuǎn)了?”這個(gè)問題。他總結(jié)出是依賴對(duì)象的獲得被反轉(zhuǎn)了。基于這個(gè)結(jié)論,他為創(chuàng)造了控制反轉(zhuǎn)一個(gè)更好的名字:依賴注入。許多非凡的應(yīng)用(比HelloWorld.java更加優(yōu)美,更加復(fù)雜)都是由兩個(gè)或是更多的類通過彼此的合作來實(shí)現(xiàn)業(yè)務(wù)邏輯,這使得每個(gè)對(duì)象都需要,與其合作的對(duì)象(也就是它所依賴的對(duì)象)的引用。如果這個(gè)獲取過程要靠自身實(shí)現(xiàn),那么如你所見,這將導(dǎo)致代碼高度耦合并且難以測試。   IoC 亦稱為 “依賴倒置原理”("Dependency Inversion Principle")。差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,這可說是IoC原理的一項(xiàng)應(yīng)用。SmallTalk,C++, Java 或各種.NET 語言等面向?qū)ο蟪绦蛘Z言的程序員已使用了這些原理。   控制反轉(zhuǎn)是Spring框架的核心。   應(yīng)用控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴的對(duì)象的引用,傳遞給它。也可以說,依賴被注入到對(duì)象中。所以,控制反轉(zhuǎn)是,關(guān)于一個(gè)對(duì)象如何獲取他所依賴的對(duì)象的引用,這個(gè)責(zé)任的反轉(zhuǎn)。
編輯本段IoC是設(shè)計(jì)模式
  IoC就是IoC,不是什么技術(shù),與GoF一樣,是一種設(shè)計(jì)模式。   Interface Driven Design接口驅(qū)動(dòng),接口驅(qū)動(dòng)有很多好處,可以提供不同靈活的子類實(shí)現(xiàn),增加代碼穩(wěn)定和健壯性等等,但是接口一定是需要實(shí)現(xiàn)的,也就是如下語句遲早要執(zhí)行:AInterface a = new AInterfaceImp(); 這樣一來,耦合關(guān)系就產(chǎn)生了,如:   Class A   {   AInterface a;   A()   {   }   aMethod()   {   a = new AInterfaceImp();   }   }   ClassA與AInterfaceImp就是依賴關(guān)系,如果想使用AInterface的另外一個(gè)實(shí)現(xiàn)就需要更改代碼了。當(dāng)然我們可以建立一個(gè)Factory來根據(jù)條件生成想要的AInterface的具體實(shí)現(xiàn),即:   InterfaceImplFactory   {   AInterface create(Object condition)   {   if(condition = condA)   {   return new AInterfaceImpA();   }   elseif(condition = condB)   {   return new AInterfaceImpB();   }   else   {   return new AInterfaceImp();   }   }   }   表面上是在一定程度上緩解了以上問題,但實(shí)質(zhì)上這種代碼耦合并沒有改變。通過IoC模式可以徹底解決這種耦合,它把耦合從代碼中移出去,放到統(tǒng)一的XML 文件中,通過一個(gè)容器在需要的時(shí)候把這個(gè)依賴關(guān)系形成,即把需要的接口實(shí)現(xiàn)注入到需要它的類中,這可能就是“依賴注入”說法的來源了。   IOC模式,系統(tǒng)中通過引入實(shí)現(xiàn)了IOC模式的IOC容器,即可由IOC容器來管理對(duì)象的生命周期、依賴關(guān)系等,從而使得應(yīng)用程序的配置和......余下全文>>
?

一道面試題:你經(jīng)常上的技術(shù)網(wǎng)站,c#net有什技術(shù)網(wǎng)站與開源的項(xiàng)目?

國內(nèi) cnblog 51cto csdn

國外
www.asp.net
www.codeproject.com
www.codeplex.com

至于開源項(xiàng)目,51aspx哪能輪得到

大名鼎鼎的Nunit, Json.net, log4net, lucene.net, paint.net, mono多了去了,看看下面的列表

1.[TEST] xUnit.net - 用于TDD的最好的測試框架之一。
2.[TEST] RhinoMocks mocking framework - 通過創(chuàng)建mock使測試更簡單。
3.[TEST] White for automation of Windows applications - 用代碼驅(qū)動(dòng)Windows程序來測試。
4.[TEST] Gallio Automation Platform - 可以運(yùn)行很多測試框架,如MSTest、xUnit、NUnit以及MbUnit。
5.[DATA] Fluent NHibernate - Fluent NHibernate讓你可以用C#代碼來設(shè)置映射關(guān)系。
6.[OOP] StructureMap Dependency Injection/Inversion of Control - 解耦類和依賴。
7.[OOP] Managed Extensibility Framework - 從靜態(tài)編譯程序轉(zhuǎn)換到動(dòng)態(tài)語言程序
8.[APPFX] s#arp architecture for web applications - 用ASP.NET MVC和NHibernate快速開發(fā)web應(yīng)用程序。
9.[APPFX] OpenRasta REST based framework for building web applications - 讓你的程序擁有一個(gè)REST API接口。
10.[APPFX] CSLA.NET Application Framework - .NET開發(fā)綜合框架
11.[APPFX] Spring.NET Application Framework - Web開發(fā)綜合框架
12.[RUNTIME] Mono enables .NET on Linux and Mac - 在Linux、BSD和OS X上使用.NET.
13.[UTIL] Sandcastle Help File Builder - 創(chuàng)建MSDN樣式的文檔。
14.[HELPER] EasyHook for Windows API Hooking - 用托管代碼擴(kuò)展非托管代碼。
15.[HELPER] Json.NET for working with JSON formatted data - 用一條語句序列化.NET對(duì)象。
16.[HELPER] Excel Data Reader for Excel 97 to 2007 - ......余下全文>>
?

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/892260.htmlTechArticlePHP依賴倒置(Dependency Injection)代碼實(shí)例,依賴倒置原則 實(shí)現(xiàn)類: 復(fù)制代碼 代碼如下: php class Container { protected $setings = array(); public function s...
PHP速學(xué)教程(入門到精通)
PHP速學(xué)教程(入門到精通)

PHP怎么學(xué)習(xí)?PHP怎么入門?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)