反射在 PHP 中的应用

反射在每个面向对象的编程语言中都存在,它的主要目的就是在运行时分析类或者对象的状态,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。 反射是操纵面向对象范型中元模型的 API,可用于构建复杂,可扩展的应用。反射在日常的 Web 开发中其实用的不多,更多的是在偏向底层一些的代码中,比如说框架的底层中依赖注入、对象池、动态代理、自动获取插件列表、自动生成文档以及一些设计模式等等,都会大量运用到反射技术。PHP 的反射 API 很多,但是常用的一般都是 和 :

1.ReflectionClass

这个是用来获取类的信息,可以简单测试一下:

获取类的方法列表:

返回的是一个 的数组:

附上一些常用方法,详细的可以查看文档:

2.ReflectionMethod

这个主要是针对方法的反射,我们可以简单执行一下:

可以输出:

附上一些常用的方法,详细的可以去看看文档:

接下来说一些反射在实际开发中比较常见的应用。

执行私有方法

其实反射不仅可以执行私有方法,还可以读取私有属性。这个主要应用在一些设计不合理的 SDK 里面,一些很好用的方法和属性却不对外开放。

执行私有方法:

读取私有属性:

动态代理

其实 PHP 有魔术方法,所以实现动态代理已经很简单了,但是通过魔术方法来实现的都不完美,个人理解最好的实现应该还是 JDK 中的动态代理,基于一个接口进行扫描实现实在 PHP 中也可以实现。我们先来看看动态代理在 JDK 中是怎么使用的:1.首先定义一个实现类的接口,JDK 的动态代理必须基于接口(Cglib则不用)

2.定义一个实现类,这个类就是要被代理的对象

3.调用被代理对象方法的实现类

4.测试

JDK 的动态代理在底层实际上是扫描实现的接口,然后动态生成类的字节码文件。PHP 是动态语言,所以可以用 eval 来实现。1.定义调度器接口

2.动态代理实现定义一个类的 stub:

定义一个方法的 stub:

Proxy 实现:

其中 和 代码:

其中 就是通过反射扫描接口方法,然后根据 stub 模板生成方法拼接成代码,最后通过 eval 执行。

2.测试

输出:

依赖注入

依赖注入是现代化框架中非常常见的一个功能,它必须和服务容器结合使用。用过 Laravel 框架的童鞋应该很熟悉,我们可以在任意需要服务的地方通过类型提示声明,运行时框架就会自动帮我们注入所需要的对象。以 Laravel 框架的源码简单解析下:在 Laravel 框架中,我们解析一个对象的方法可以这样:

方法实际上底层也是调用了 这个方法,整理一下源码就是:

实际代码很简单,反射类获取构造方法,然后解析依赖参数,传入执行。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180109G07WX300?refer=cp_1026

同媒体快讯

  • OAuth 2.0 理解

    2018-10-17

相关快讯

扫码关注云+社区