一個簡單的「IOC」例子

MArtian發表於2023-03-06

控制反轉(Inversion of Control,縮寫IoC)是一種的物件設計模式,它把物件的建立和使用分開,透過容器來管理物件之間的依賴關係。在PHP中可以使用現成的容器類庫或手動編寫容器來實現IoC。以下是一個使用手動編寫容器的例子:

// 定義某個類,它需要依賴於其他類
class SomeClass {
    public function __construct(SomeDependency $dep) {
        $this->dep = $dep;
    }
    public function doSomething() {
        echo $this->dep->getValue();
    }
}

// 定義另外一個類,它是SomeClass的依賴
class SomeDependency {
    public function getValue() {
        return "Hello, I am dependency!";
    }
}

// 手動編寫容器,並將SomeDependency類的例項註冊到容器中
$container = [];
$container['SomeDependency'] = function(){
    return new SomeDependency();
};

// 從容器中獲取SomeClass的例項並使用  
$container['SomeClass'] = function($container){
    return new SomeClass($container['SomeDependency']());
};
$someClass = $container['SomeClass']($container);

// 輸出: Hello, I am dependency!
$someClass->doSomething();

在這個例子中,SomeClass 類需要依賴於 SomeDependency 類,因此在其建構函式中接受了一個 SomeDependency 類的例項,並呼叫其 getValue() 方法。

接下來我們手動編寫了一個容器 $container,並將 SomeDependency 類作為其中的一個服務進行註冊。在註冊 SomeClass 類時,我們利用了 PHP 的閉包函式來將 SomeDependency 類的例項注入 SomeClass 類建構函式中,實現了控制反轉。

最後,我們可以透過從容器中獲取 SomeClass 類的例項並呼叫其 doSomething() 方法,來使用我們手動編寫的IoC容器。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我從未見過一個早起、勤奮、謹慎,誠實的人抱怨命運。

相關文章