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+SqlServer实现分页显示
Oct 09 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 PHP
php简单压缩css样式示例
Sep 22 PHP
浅谈php处理后端&接口访问超时的解决方法
Oct 29 PHP
php二维码生成以及下载实现
Sep 28 PHP
php实现有序数组旋转后寻找最小值方法
Sep 27 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 PHP
Laravel实现ApiToken认证请求
Oct 14 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设计模式之数据对象映射模式
2016/03/03 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python批量发送post请求的实现代码
2018/05/05 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
django将数组传递给前台模板的方法
2019/08/06 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
Python实现简单的2048小游戏
2021/03/01 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
竞选班干部演讲稿300字
2014/08/20 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
2014年科技工作总结
2014/11/26 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
八年级语文教学反思
2016/03/03 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python