概念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