上一节 主要系统讲了反射的用法,虽然讲解了用法,但是没有对其在项目中的实际使用做讲解,不学以致用,不如不学。
在好多框架底层实现上面使用了反射,所以要理解和分析框架底层源码的话,必须掌握反射,不然的话理解十分的困难。
下面我们讲下反射在实际开发中的应用。
- 自动生成文档
- 实现 MVC 架构
- 实现单元测试
- 配合 DI 容器解决依赖
- …
自动生成文档
根据反射的分析类,接口,函数和方法的内部结构,方法和函数的参数,以及类的属性和方法,可以自动生成文档。
|
|
运行 php file.php
就可以看到相应的文档信息。
实现 MVC 架构
现在好多框架都是 MVC
的架构,根据路由信息定位 控制器($controller) 和方法($method) 的名称,之后使用反射实现自动调用。
|
|
实现单元测试
一般情况下我们会对函数和类进行测试,判断其是否能够按我们预期返回结果,我们可以用反射实现一个简单通用的类测试用例。
|
|
这是类的测试方法,也可以利用反射实现函数的测试方法。
这里只是我简单写的一个测试用例,PHPUnit
单元测试框架很大程度上依赖了 Reflection
的特性,可以了解下。
配合 DI 容器解决依赖
Laravel
等许多框架都是使用 Reflection
解决依赖注入问题,具体可查看 Laravel
源码进行分析。
下面我们代码简单实现一个 DI
容器演示 Reflection
解决依赖注入问题。
|
|
注意上面的 calc
和 demo
的顺序,不能颠倒,不然的话会报错,原因是由于 Demo
依赖 Calc
,首先要定义依赖关系。
在 Demo
实例化的时候,会用到 Calc
类,也就是说 Demo
依赖于 Calc
,但是在 $data
上面找不到的话,会抛出错误,所以首先要定义 $di->calc = 'Calc'
。
Reflection 是一个非常 Cool 的功能,使用它,但不要滥用它。
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
End