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 相关文章推荐
PHP5在Apache下的两种模式的安装
Sep 05 PHP
配置PHP使之能同时支持GIF和JPEG
Oct 09 PHP
php获取url字符串截取路径的文件名和扩展名的函数
Jan 22 PHP
一道关于php变量引用的面试题
Aug 08 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
May 23 PHP
PHP实现的ID混淆算法类与用法示例
Aug 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
javascript 网页跳转的方法
2008/12/24 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python网络编程之文件下载实例分析
2015/05/20 Python
Python常用小技巧总结
2015/06/01 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
机器学习10大经典算法详解
2017/12/07 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
品恩科技软件测试面试题
2014/10/26 面试题
2014年党支部学习材料
2014/05/19 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2014年科普工作总结
2014/12/06 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
初中重阳节活动总结
2015/05/05 职场文书
纪检监察立案决定书
2015/06/24 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python