容器、依赖注入引申出PHP的反射

分享于:2019-10-28 20:26:48

我们在学习PHP框架,像ThinkPHP6、laravel都有介绍容器,有些学习者对“容器”这个概念不太了解。这里楠神就简单介绍下“容器”是干嘛的:


1)先去学习下PHP的注册模式《PHP的设计模式(一)之注册模式、适配器模式》。


2)PHP框架先实例化一个容器对象(单例模式,这一次请求就实例这个一个容器对象),然后再使用注册模式,把其他的对象实例(例如Request、Response、Route对象)注册到这个容器对象上。


为什么要注册?其目的也是为了把实例过的对象可以后续地单例调用。


PHP框架使用“容器”做架构,统一管理对象实例,它其中方便实现两个功能“依赖注入”与“参数绑定”,主要说下“依赖注入”。


什么是“依赖注入”?


依赖注入本质上是指对类的依赖通过构造器完成自动注入,例如在控制器构造方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。


演示一段代码:

<?php
namespace app\controller;
use think\Request;

class Index{

    protected $request;

    public function __construct(Request $request){
        $this->request = $request;
    }

    public function hello($name){
        return 'Hello,' . $name . '!This is '. $this->request->action();
    }
    
}


构造方法$request(Request对象参数),不需要我们手动实例Request对象,框架会自动从容器对象获取Request对象,然后注入。


从容器对象获取Request对象,如果Request对象还没有注册,容器对象就会使用反射实例化一个Request对象,并注册。


框架是怎么识别参数的对象类型约束呢?这里也是用的PHP的反射知识。


针对我上面讲解的这些东西有朋友不知道讲的什么内容,推荐你去看下thinkPHP6框架think\Container容器类的代码。


说下本节要引申出的重点内容:反射


什么是反射?


动态获取 类的方法、属性、参数,注释 等 信息以及动态调用对象的方法的功能称为反射API。 

反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。比如 Laravel 的容器。


反射类/函数的功能


可以获取类的一切信息,包括: 

1. 类基本信息(类名、是否是抽象类、是否可实例化、类是否为final或者abstract) 

2. 类的方法、方法是否存在、方法返回值、方法的注释、Method Names 

3. 类的属性,静态属性,常量 

4. 所在命名空间 Namespace


关于反射不做代码演示了,推荐参考thinkPHP6框架think\Container反射的应用。


PHP手册:函数参考-》变量与类型相关扩展-》反射