参考资料:php:laravel底层核心代码分析之make方法的实现Laravel加载过程---make方法实例化Illuminate\Contracts\Http\Kernelmake方法/public/index.php$app=require_once__DIR__.'/../bootstrap/app.php';$kernel=$app->make(Illuminate\Contracts\Http\Kernel::class);$app->make()=>make()inparentclassApplication=>resolve()Methodresolvemethodvendor/laravel/framework/src/Illuminate/Container/Container.php/***第一次调用*$abstractIlluminate\Contracts\Http\Kernel::class*$concrete匿名函数**第二次调用*$abstract'App\Http\Kernel'*$concrete'App\Http\Kernel'(getConcrete方法返回)*执行build()方法获取App\Http\Kernel的实例化对象并将其返回给getClosure()*/protectedfunctionresolve($abstract,$parameters=[],$raiseEvents=true){...//从绑定中获取$concrete根据$abstract匿名函数数组$concrete=$this->getConcrete($abstract);//判断$concrete和$abstract是否相同,或者$concrete是匿名函数if($this->isBuildable($concrete,$abstract)){//实例化$concrete类$object=$this->建造($混凝土);}别的{//递归执行make$object=$this->make($concrete);}...}getClosure()方法递归调用/***第一次调用*$abstract'Illuminate\Contracts\Http\Kernel'*$concrete'App\Http\Kernel'**第二次调用*获取App的实例\Http\Kernel返回给build()方法*/protectedfunctiongetClosure($abstract,$concrete){returnfunction($container,$parameters=[])use($abstract,$concrete){if($abstract==$concrete){return$container->build($concrete);}返回$container->resolve($concrete,$parameters,$raiseEvents=false);};}构建方法vendor/laravel/framework/src/Illuminate/Container/Container.php/***第一次调用*$concrete匿名函数**第二次调用*$concrete'App\Http\Kernel'*执行反射获取App\Http\Kernel类*的实例化对象并将其返回给resolve()方法*/publicfunctionbuild($concrete){if($concreteinstanceofClosure){//bind()方法$concrete=$this->getClosure($abstract,$concrete);返回$concrete($this,$this->getLastParameterOverride());}$reflector=newReflectionClass($concrete);如果(!$reflector->isInstantiable()){返回$this->notInstantiable($concrete);}$this->buildStack[]=$concrete;$constructor=$reflector->getConstructor();如果(is_null($constructor)){array_pop($this->buildStack);返回新的$混凝土;}$dependencies=$constructor->getParameters();$instances=$this->resolveDependencies($dependencies);array_pop($this->buildStack);return$reflector->newInstanceArgs($instances);}流程示意图示例
