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 相关文章推荐
PHP6 先修班 JSON实例代码
Aug 23 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
分享一则PHP定义函数代码
Feb 26 PHP
Laravel 5框架学习之表单
Apr 08 PHP
php生成过去100年下拉列表的方法
Jul 20 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
Oct 21 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 Class&Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
python发送伪造的arp请求
2014/01/09 Python
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
Python编码爬坑指南(必看)
2016/06/10 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
对python的输出和输出格式详解
2018/12/08 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
python能做什么 python的含义
2019/10/12 Python
pycharm快捷键汇总
2020/02/14 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
销售类个人求职信范文
2013/09/25 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
计算机专业求职信
2014/06/02 职场文书
小学课外活动总结
2014/07/09 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
2015年实习单位评语
2015/03/25 职场文书
go xorm框架的使用
2021/05/22 Golang
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫