PHP进阶学习之反射基本概念与用法分析


Posted in PHP onJune 18, 2019

本文实例讲述了PHP进阶学习之反射基本概念与用法。分享给大家供大家参考,具体如下:

一、前言

Reflection(反射)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。这一特征在实际应用中也许用得不是很多。

PHP从5.0开始完美支持反射API。PHP反射可以用于观察并修改程序在运行时的行为。一个面向反射的(reflection-oriented)程序组件可以监测一个范围内的代码执行情况,可以根据期望的目标与此相关的范围修改本身。PHP5具有完整的反射API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。

二、概念

反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。

三、PHP反射的基本语法

实现反射的方法有很多,可以通过实例化一个专门控制类的ReflectionClass类来实现反射,也可以在已有类实例的情况下,通过直接实例化ReflectionMethod类来执行反射方法,原理如图:

PHP进阶学习之反射基本概念与用法分析

PHP进阶学习之反射基本概念与用法分析

以下是对反射类和反射方法类的基本用法:

1、反射类

(1) $reflectClass = new ReflectionClass(<类名>);

传入类名字符串,返回控制目标类的ReflectionClass类实例;

(2) $reflectClass->getConstant(<常量名>);

传入类中定义了的常量名,返回常量值,可通过$reflectClass->getConstants返回类中所有定义的常量的数组;

(3) $class = $reflectClass->newInstance();

实例化类,返回目标类实例;也可通过$reflectClass->newInstanceArgs(<参数数组>)传入实例化的构造函数参数进行实例化;

2、反射方法

(1) $reflectMethod = new ReflectionMethod(<方法名>);

传入方法名名字符串,返回控制目标方法的ReflectionMethod类实例;

(2) $parameters = $reflectMethod->getParameters();

获取该类所需的参数名,该方法返回一个包含所有参数名的二维数组;

(3) $name = $parameters->getName();

返回要执行的方法所需参数数组的单个参数名,可通过foreach循环逐一获取和赋值;

(4) $reflectMethod->invokeArgs(<类实例>,<执行该方法所需参数数组>);

传入类实例和方法参数,执行方法,返回执行结果。

3、反射类和反射方法中其他常用的用法:

ReflectionClass:

PHP进阶学习之反射基本概念与用法分析

ReflectionMethod:

PHP进阶学习之反射基本概念与用法分析

4、除了ReflectionClass和ReflectionMethod,我们对于类中的参数、属性和php服务的环境变量、扩展等参数也是可以通过反射API的一些方法来执行的,如下:

PHP进阶学习之反射基本概念与用法分析

四、反射在实际应用中的使用

1、反射可以用于文档、文件生成。可以用它对文件里的类进行扫描,逐个生成描述文档;
2、既然反射可以探知类的内部结构,那么可以用它做hook实现插件功能
3、可以用于做动态代理,在未知或者不确定类名的情况下,动态生成和实例化一些类和执行方法;
4、对于多次继承的类,我们可以通过多次反射探索到基类的结构,或者采用递归的形式反射,实现实例化所有继承类,这即是PHP依赖注入的原理。

五、PHP反射的优缺点

优点

1、支持反射的语言提供了一些在低级语言中难以实现的运行时特性。
2、可以在一定程度上避免硬编码,提供灵活性和通用性
3、可以作为一个第一类对象发现并修改源代码的结构(如代码块、类、方法、协议等)。
4、可以在运行时像对待源代码语句一样计算符号语法的字符串(类似JavaScript的eval()函数),进而可将跟class或function匹配的字符串转换成class或function的调用或引用。
5、可以创建一个新的语言字节码解释器来给编程结构一个新的意义或用途。

劣势

1、此技术的学习成本高。面向反射的编程需要较多的高级知识,包括框架、关系映射和对象交互,以利用更通用的代码执行。
2、同样因为反射的概念和语法都比较抽象,过多地滥用反射技术会使得代码难以被其他人读懂,不利于合作与交流。
3、由于将部分信息检查工作从编译期推迟到了运行期,此举在提高了代码灵活性的同时,牺牲了一点点运行效率
4、通过深入学习反射的特性和技巧,它的劣势可以尽量避免,但这需要许多时间和经验的积累。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
2.PHP入门
Oct 09 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
帝国cms常用标签汇总
Jul 06 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 #PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 #PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 #PHP
php设计模式之装饰模式应用案例详解
Jun 17 #PHP
php设计模式之策略模式应用案例详解
Jun 17 #PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 #PHP
PHP 并发场景的几种解决方案
Jun 14 #PHP
You might like
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
linux下编译安装memcached服务
2014/08/03 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
基于javascript实现的快速排序
2016/12/02 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
基于python 字符编码的理解
2017/09/02 Python
python实现二分查找算法
2017/09/21 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
python实现雨滴下落到地面效果
2018/06/21 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
恒华伟业笔试面试题
2015/02/26 面试题
高中生评语大全
2014/04/25 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
总经理检讨书范文
2015/02/16 职场文书
保险内勤岗位职责
2015/04/13 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android