[laravel源码]Container/build解析
说明
本章说明容器中 build
的解析。
源码
public function build($concrete)
{
// 1. 匿名函数,直接返回
if ($concrete instanceof Closure) {
return $concrete($this, $this->getLastParameterOverride());
}
// 2. 动态反射创建类
$reflector = new ReflectionClass($concrete);
// 3. 判断是否可实例化 (抽象/接口/final,不可实例化)
if (! $reflector->isInstantiable()) {
//不可实例化则抛出异常
return $this->notInstantiable($concrete);
}
$this->buildStack[] = $concrete;
// 4. 获取constructor
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
array_pop($this->buildStack);
return new $concrete;
}
// 5. 获取传入的参数
$dependencies = $constructor->getParameters();
// 6. 处理参数
$instances = $this->resolveDependencies(
$dependencies
);
array_pop($this->buildStack);
// 7. 根据参数创建新的对象
return $reflector->newInstanceArgs($instances);
}
分析
本作品采用《CC 协议》,转载必须注明作者和本文链接