Laravel底层学习笔记03 make和build

IT小马 -
Laravel底层学习笔记03 make和build

参考资料:
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() => 父类Application中的make() => resolve()方法resolve方法vendor/laravel/framework/src/Illuminate/Container/Container.php
/**
 * 第一次调用
 * $abstract Illuminate\Contracts\Http\Kernel::class
 * $concrete 匿名函数
 * 
 * 第二次调用
 * $abstract 'App\Http\Kernel'
 * $concrete 'App\Http\Kernel' (getConcrete方法返回)
 * 执行build()方法获取App\Http\Kernel的实例化对象,返回给getClosure()
 */
protected function resolve($abstract, $parameters = [], $raiseEvents = true)
{   
    ...
    //根据$abstract从bindings数组中获取$concrete匿名函数
    $concrete = $this->getConcrete($abstract);
    //判断$concrete和$abstract是否相同,或者$concrete是一个匿名函数
    if ($this->isBuildable($concrete, $abstract)) {
        //实例化$concrete的类
        $object = $this->build($concrete);
    } else {
        //递归执行make
        $object = $this->make($concrete);
    }
    ...
 }   
getClosure()方法递归调用
/**
 * 第一次调用
 * $abstract 'Illuminate\Contracts\Http\Kernel'
 * $concrete 'App\Http\Kernel'
 * 
 * 第二次调用
 * 获取App\Http\Kernel的实例,向上返回给build()方法
 */
protected function getClosure($abstract, $concrete)
{
    return function ($container, $parameters = []) use ($abstract, $concrete) {
        if ($abstract == $concrete) {
            return $container->build($concrete);
        }
        return $container->resolve($concrete, $parameters, $raiseEvents = false);
    };
}
build方法vendor/laravel/framework/src/Illuminate/Container/Container.php
/**
 * 第一次调用
 * $concrete 匿名函数
 * 
 * 第二次调用
 * $concrete 'App\Http\Kernel' 
 * 执行反射,获取App\Http\Kernel类的实例化对象
 * 返回给resolve()方法
 */
public function build($concrete)
{
    if ($concrete instanceof Closure) {
        //bind()方法中$concrete = $this->getClosure($abstract, $concrete);
        return $concrete($this, $this->getLastParameterOverride());
    }
    $reflector = new ReflectionClass($concrete);
    if (! $reflector->isInstantiable()) {
        return $this->notInstantiable($concrete);
    }
    $this->buildStack[] = $concrete;
    $constructor = $reflector->getConstructor();
    if (is_null($constructor)) {
        array_pop($this->buildStack);
        return new $concrete;
    }
    $dependencies = $constructor->getParameters();
    $instances = $this->resolveDependencies(
        $dependencies
    );
    array_pop($this->buildStack);
    return $reflector->newInstanceArgs($instances);
}
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

laravel介绍

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数

Tags 标签

laravelphp

扩展阅读

加个好友,技术交流

1628738909466805.jpg