Laravel5 容器自动加载依赖的原理
来源:互联网 发布:mac eclipse改java版本 编辑:程序博客网 时间:2024/06/05 05:01
laravel的App::make()是如何解决实例化时所需的依赖的?
比如说:A类的构造函数参数依赖B类
class A {public function __construct(B $b) {}}
实例化A类,需要new A(new B);
而laravel的容器可以这样:App:make(A::class),自动的解决了B类的依赖,它是如何做到的?
首先看容器的核心类:Illuminate\Container\Container的make方法,里面调用了bulid方法,这个bulid是解决依赖的核心:
第一步:创建PHP的反射类ReflectionClass的对象,可以解析一个类的信息
$reflector = new ReflectionClass($concrete);
第二步:调用它的getConstructor方法,可以获取类的构造函数,它返回一个php的ReflectionMethod类的对象
$constructor = $reflector->getConstructor();
第三步:调用ReflectionMethod类的getParameters方法,获取构造函数的参数。它返回一个数组,成员是php的ReflectionParameter类的对象
$dependencies = $constructor->getParameters();
第四步:根据参数,实现所有的依赖。
$instances = $this->getDependencies($dependencies, $parameters);
$this->getDependencies()方法具体的看源码,有点复杂,分3个类别处理
1.容器有第二个参数时,如果吻合类型,直接用第二个参数解决依赖。
2.如果容器绑定过这个类,用call_user_func()调用自定义的闭包。
3.如果不符合以上,则嵌套调用App::make()来实例化依赖。
第五步:调用ReflectionClass对象的newInstanceArgs方法,创建一个新的类的实例,并返回最终的解决了依赖的对象。
return $reflector->newInstanceArgs($instances)
- Laravel5 容器自动加载依赖的原理
- 关于laravel 自动加载和依赖注入、服务容器、服务提供者的理解--1
- laravel5.2总结--服务容器(依赖注入,控制反转)
- laravel5——神奇的IoC容器
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
- Maven加载依赖速度慢的原理和解决办法
- Spring MVC 容器加载原理
- composer 自动加载原理
- log4j自动加载原理
- Spring容器拆分、自动装配和依赖检查机制,基于注解的sessionFactory
- IOC容器的依赖注入
- IOC容器的依赖注入
- Struts2容器之Container与ContainerImpl深入剖析及其Struts2依赖注入的原理剖析
- Laravel5.5源码详解 -- Config 配置文件的加载
- 依赖注入的原理
- PHP-自动加载原理分析
- 深入理解composer的autoload自动加载原理
- PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
- mysql 字符串处理
- Lowest Common Multiple Plus ——ACM
- linux
- Go 支持Protocol Buffers的配置
- Centos6.8通过yum安装mysql5.7
- Laravel5 容器自动加载依赖的原理
- mac下修改mysql数据库的默认编码为utf-8
- protoc 命令参数
- 判断一个对象是否为空
- 如何自学机器学习
- MySQL时间戳和日期相互转化
- Laravel5:sql语句的正确打印方式
- 神奇密码锁
- WSDL 详解