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.01发布
Oct 09 PHP
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
ajax php传递和接收变量实现思路及代码
Dec 19 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
PHP实现在线阅读PDF文件的方法
Jun 17 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 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实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
php实现小程序支付完整版
2018/10/09 PHP
js 自动播放的实例代码
2013/11/19 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
vue 清空input标签 中file的值操作
2020/07/21 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
python3 与python2 异常处理的区别与联系
2016/06/19 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
Python实现识别手写数字大纲
2018/01/29 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
公司承诺书格式范文
2015/04/28 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
python实现会员管理系统
2022/03/18 Python