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和ACCESS写聊天室(六)
Oct 09 PHP
php session和cookie使用说明
Apr 07 PHP
解析php中的fopen()函数用打开文件模式说明
Jun 20 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
php简单实现sql防注入的方法
Apr 22 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
CodeIgniter框架基本增删改查操作示例
Mar 23 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 json_encode值中大括号与花括号区别
2013/09/30 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
告诉大家什么是JSON
2008/06/10 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
python中return的返回和执行实例
2019/12/24 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
工程班组长岗位职责
2013/12/30 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
农业生产宣传标语
2014/10/08 职场文书
见习报告格式要求
2014/11/04 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
孝女彩金观后感
2015/06/10 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
新员工入职感言范文!
2019/07/04 职场文书
人生感悟经典句子
2019/08/20 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS