php 的反射详解及示例代码


Posted in PHP onAugust 25, 2016

 最近在看java编程思想,看到类型信息这一章,讲到了类的信息以及反射的概念。顺便温故一下php的反射东西。手册是这样说的:"PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。"当然手册上说的有些抽象!所谓的逆向说白就是能获取关于类、方法、属性、参数等的详细信息,包括注释! 文字总是那么枯燥,举个例子

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
  
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}

$ref = new ReflectionClass('Foo');
$props = $ref->getProperties();
foreach ($props as $value) {
  echo $value->getName()."\n";
}

//output
//foo 
//bar
//baz

ReflectionClass 这个类返回时某个类的相关的信息,比如 属性,方法,命名空间,实现那些接口等!上个例子中ReflectionClass:: getProperties 返回是 ReflectionProperty 对象的数组。

ReflectionProperty 类报告了类的属性的相关信息。比如  isDefault isPrivate  isProtected isPublic isStatic等,方法getName 是获取属性的名称!

以上是获取属性的,还有获取类方法的比如

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
  
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}

$ref = new ReflectionClass('Foo');
$method = $ref->getMethod('myMethod');
$method->invoke($ref->newInstance());

ReflectionClass::getMethod 是反是一个 ReflectionMethod 类型 ,ReflectionMethod 类报告了一个方法的有关信息,比如 isAbstract isPrivate  isProtected isPublic isStatic   isConstructor,还有一个重要的方法Invoke,InvokeArgs 就是执行方法!

其他的对象可以看看手册,不是很难!

那反射究竟有哪些用途?

反射是一个动态运行的概念,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。还可构建模式,比如动态代理。在一些php框架中使用反射也是很经常,比如kohana,yii,下面是kohana 的实现mvc的代码,就是用到了反射!

// Start validation of the controller
$class = new ReflectionClass(ucfirst(Router::$controller).'_Controller');
// Create a new controller instance
$controller = $class->newInstance();
// Load the controller method
$method = $class->getMethod(Router::$method);
// Execute the controller method
$method->invokeArgs($controller, $arguments);

上面的代码可以清晰看到这个框架的流程!通过Router 其实就处理url的类,通过Router可以获取哪个控制器、哪个方法!然后再执行方法!

以上就是对PHP 反射的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

PHP 相关文章推荐
发挥语言的威力--融合PHP与ASP
Oct 09 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
php生成局部唯一识别码LUID的代码
Oct 06 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
PHP解密Unicode及Escape加密字符串
May 17 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
Oct 08 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 PHP
php 输入输出流详解及示例代码
Aug 25 #PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 #PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 #PHP
PHP sleep()函数, usleep()函数
Aug 25 #PHP
PHP页面间传递值和保持值的方法
Aug 24 #PHP
PHP中explode函数和split函数的区别小结
Aug 24 #PHP
php处理单文件、多文件上传代码分享
Aug 24 #PHP
You might like
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
php mail to 配置详解
2014/01/16 PHP
php单例模式示例分享
2015/02/12 PHP
php类自动加载器实现方法
2015/07/28 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
javascript 函数调用规则
2009/08/26 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
Python入门篇之条件、循环
2014/10/17 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
代理商会议邀请函
2014/01/27 职场文书
元旦晚会策划方案
2014/02/18 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
关于EntityWrapper的in用法
2022/03/22 Java/Android