前言
反射它指在 PHP 运行状态中,扩展分析 PHP 程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
这种动态获取的信息以及动态调用对象的方法的功能称为反射 API。
反射是操纵面向对象范型中元模型的 API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。其用途如:自动加载插件,自动生成文档,甚至可用来扩充 PHP 语言
概念理解
什么是反射?
获取类的有关信息 ReflectionClass:https://www.php.net/manual/zh/class.reflectionclass.php
获取类的构造函数 getConstructor:https://www.php.net/manual/zh/reflectionclass.getconstructor.php
获取类的依赖类 getParameters:https://www.php.net/manual/zh/reflectionfunctionabstract.getparameters.php
通过下面的伪代码,可以获取到 class A 的构造函数,还有构造函数依赖的类。此处 class A 构造函数依赖 args
,而且通过 TypeHint 可以知道他是类型为 Class B。
此反射机制可以让我去解析一个类,能获取一个类的属性、方法、构造函数、构造函数所需要的参数。
<?php
class B{
}
class A {
public function __construct(B $args) {
}
public function dosomething() {
echo 'Hello world';
}
}
// 建立 A class 的反射
// 返回:object(ReflectionClass)#1 (1) { ["name"]=> string(1) "A" }
$reflection = new ReflectionClass('A');
//var_dump($reflection);die;
// 获取class A 的实例
// 返回:object(A)#3 (0) { }
$instance = $reflection ->newInstanceArgs([ new B() ]);
//var_dump($instance);die;
//输出 ‘Hellow World’
$dosomething = $instance->dosomething();
// 获取 A class 的构造函数
$constructor = $reflection->getConstructor();
//获取 A class 的依赖类
$dependencies = $constructor->getParameters();
// 返回 A 的构造函数
var_dump($constructor);
// 返回 A 的依赖类
var_dump($dependencies);
// 返回结果如下:
//constructor
/*
ReflectionMethod {#351 ▼
+name: "__construct"
+class: "A"
parameters: array:1 [▶]
extra: array:3 [▶]
modifiers: "public"
}*/
//$dependencies
/*array:1 [▼
0 => ReflectionParameter {#352 ▼
+name: "args"
position: 0
typeHint: "B"
}
]
*/
IOC 容器
接下来介绍一下 Laravel 的 IOC 服务容器概念。在 laravel 框架中, 服务容器是整个 laravel 的核心,它提供了整个系统功能及服务的配置,调用。
容器按照字面上的理解就是装东西的东西,比如冰箱, 当我们需要冰箱里面的东西的时候直接从里面拿就行了。服务容器也可以这样理解, 当程序开始运行的时候,我们把我们需要的一些服务放到或者注册到 (bind) 到容器里面,当我需要的时候直接取出来 (make) 就行了。上面提到的 bind
和 make
就是注册 和 取出的 两个动作。
IOC容器代码
下面要上一段容器的代码了。下面这段代码不是 laravel 的源码, 而是来自一本书《laravel 框架关键技术解析》
https://learnku.com/articles/4076/how-to-understand-laravels-ioc-container