概念php
依賴注入(不須要全部的都須要手動new N屢次)laravel
php相關語法及特性spring
laravel中已經實現的類bootstrap
index.php中註冊HttpKernel,而後設計模式
Http/Kernel.php的handle
($request)->sendRequestThroughRouter
->bootstrap
數組
bootstrapWith
(arrray $bootstrappers),注意這個bootstartps裏面的數組對象是硬編碼的(定義在BilibiiLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php->bootstrappers)如下代碼及註釋,來自於/vendor/laravel/framework/src/Illuminate/Foundation/Application.phpapp
public function bootstrapWith(array $bootstrappers) { $this->hasBeenBootstrapped = true; foreach ($bootstrappers as $bootstrapper) { $this['events']->dispatch('bootstrapping: ' . $bootstrapper, [$this]); /*依次從容器中拿出實例對象,而後依次調用對象的bootstrap方法。沒錯,沒個bootstraper都有一個本身的bootstrap方法。他們在 /vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap中有具體體現.注意他須要一個參數這個參數就是$this, 不過你可能要問,這裏是怎麼直接make了呢?make的前提不得是bind或者instance啥的嗎?簡單介紹以下: 1. 由於咱們這裏看的好比cache,router等facade,他們都是經過 xxxServiceProvider 的register方法去註冊的 2. 那麼接着來的問題是,xxxServiceProvider又是何時調用的?細心的看一下當前這個類的構造方法,其中有 - registerBaseBindings - registerBaseServiceProviders - registerCoreContainerAliase 3. 而後在看一下當前這個類的register方法,有一個register方法,而調用者就是解析出來的provider了, 4. 而每一個provider都會有一個register方法,而後歸根到底會有一個new方法 5. 我這裏簡單加一行if判斷,能夠具體走到RegisterFacades方法*/ if ($bootstrapper == 'Illuminate\Foundation\Bootstrap\RegisterFacades') { // 這個$this就是application對象,而後你能夠去追一下RegisterFacades的bootstrap方法 $this->make('Illuminate\Foundation\Bootstrap\RegisterFacades')->bootstrap($this); } $this->make($bootstrapper)->bootstrap($this); $this['events']->dispatch('bootstrapped: ' . $bootstrapper, [$this]); }
RegisterFacades的bootstrap方法composer
register
方法,期間合併了app.php中的配置和composer中的配置,而後調用prependToLoaderStack
spl_autoload_register
,調用了AliasLoader自身的load方法,而後根據namespace和定義的別名去加載並renturn