前言

反射它指在 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) 就行了。上面提到的 bindmake 就是注册 和 取出的 两个动作。

IOC容器代码

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

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

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