前言

反射它指在 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。

此反射机制可以让我去解析一个类,能获取一个类的属性、方法、构造函数、构造函数所需要的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?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) 就行了。上面提到的 bindmake 就是注册 和 取出的 两个动作。

IOC容器代码

下面要上一段容器的代码了。下面这段代码不是 laravel 的源码, 而是来自一本书《laravel 框架关键技术解析》

https://learnku.com/articles/4076/how-to-understand-laravels-ioc-container

https://learnku.com/laravel/t/26922