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 相关文章推荐
PHP4之真OO
Oct 09 PHP
php简单封装了一些常用JS操作
Feb 25 PHP
PHP读取MySQL数据代码
Jun 05 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
Jun 17 PHP
PHP判断表单复选框选中状态完整例子
Jun 24 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
Apr 01 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
php-fpm开启状态统计的方法详解
Jun 23 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 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/01/22 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
Vue实现一个无限加载列表功能
2018/11/13 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
Python松散正则表达式用法分析
2016/04/29 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
python 随机森林算法及其优化详解
2019/07/11 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
新闻专业个人自我评价
2013/09/21 职场文书
《画》教学反思
2014/04/14 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书