程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP依賴倒置(Dependency Injection)代碼實例,依賴倒置原則

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

編輯:關於PHP編程

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


實現類:

復制代碼 代碼如下:
<?php
 
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;
    }
}

實現實例:

復制代碼 代碼如下:
<?php
 
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 - ......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved