實作 Container in PHP
Container 機制是一種依賴注入的設計模式,它允許您將對象的創建和解析分離。這意味著您可以在應用程序中創建一個容器,然後使用容器來解析對象,而不是直接創建它們。這樣做的好處是,您可以更輕鬆地管理對象之間的依賴關係,並且可以更輕鬆地進行單元測試。 Container 機制通常由一個容器類別實現,該類別包含一個綁定數組,用於存儲抽象類別和具體類別之間的映射。當您需要解析一個對象時,容器會查找該對象的綁定,然後使用綁定中指定的具體類別或 Closure 創建該對象。 Container 機制還支持單例模式。如果您需要在應用程序中共享一個對象,則可以使用 singleton 方法來綁定抽象類別到具體類別或 Closure,並將 shared 參數設置為 true。這樣做可以確保每次解析該對象時都返回同一個實例。 使用 ReflectionClass 來解析對象,並使用 ReflectionParameter 來獲取對象的構造函數的參數列表。然後,它遞歸地解析每個參數的依賴關係,直到所有依賴關係都被解析為止。如果對象沒有構造函數,則直接返回一個新的對象實例。否則,它會使用 ReflectionClass::newInstanceArgs() 方法創建一個新的對象實例,並傳遞解析後的依賴關係作為參數。這種方法的好處是,它可以更輕鬆地管理對象之間的依賴關係,並且可以更輕鬆地進行單元測試。 基礎 Container 實作 <?php require_once 'Container.php'; class Foo {} $container = new Container; // 綁定 foo => new Foo $container->bind('foo', function ($container) { return new Foo; }); $foo1 = $container->make('foo'); var_dump($foo1); // object(Foo)#3 (0) { } 具體來說是怎麼實現這種綁定 Container,以下會逐步實現: 實現 bind class Container { protected $bindings = []; // 綁定一個實例進入 container public function bind($abstract, $concrete = null, $shared = false) { // $shared 參數用於指示是否應該返回同一個實例。 // 如果 shared 參數設置為 true,則返回同一個實例。 // 這對於需要共享的對象非常有用,例如資料庫連接或日誌記錄器。 // 如果 shared 參數設置為 false,則每次調用 make 方法時都會創建一個新的實例。 $this->bindings[$abstract] = compact('concrete', 'shared'); // array(1) { ["foo"]=> array(2) { ["concrete"]=> object(Closure)#1 (1) { ["parameter"]=> array(1) { ["$container"]=> string(10) "" } } ["shared"]=> bool(false) } } } ....