Thinkphp5.1引入了容器類來管理各種對象,使用註冊數模式管理對象,還使用了php的反射機制實現對象之間的依賴和注入。
Container的重要屬性
1.$instances = array(); 存放對象的一個數組
2.$bind = array( //默認的標識=>類名,獲取實例時,當傳入標識,可以通過這個屬性找到類名,然後進行實例化操作。
'app' => App::class,...
);
3.$name = [];當容器有對象的時候,就寫入標識=>實例
自 PHP 5.5 起,關鍵詞 class 也可用於類名的解析。使用 ClassName::class 你可以獲取一個字符串,包含了類 ClassName 的完全限定名稱。
$bind屬性寫好了框架默認的一些標識=>類名,如果需要動態添加自定義的標識=>類名,可以在application/provider.php寫入對應的數組。框架初始化的時候會merge到$bind屬性中。
Container的重要方法
1.make($abstract, $vars = [], $newInstance = false),創建實例,$abstract可以是類名或者標識,如果是標識,需要是在$bind屬性中定義好的,或者在provider.php中添加的。找到對應的類名後,就調用invokeClass($class, $vars = []);
2.invokeClass($class, $vars = []),利用反射機制創建實例,$class是類名