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 相关文章推荐
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
PHP 多进程 解决难题
Jun 22 PHP
认识并使用PHP超级全局变量
Jan 26 PHP
PHP提取数据库内容中的图片地址并循环输出
Mar 21 PHP
PHP可变函数的使用详解
Jun 14 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 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
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
JavaScript的目的分析
2007/01/05 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
js cookies实现简单统计访问次数
2009/11/24 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python内置函数dir详解
2015/04/14 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
青年文明号服务承诺
2014/03/31 职场文书
班主任个人工作反思
2014/04/28 职场文书
中学生民族团结演讲稿
2014/08/27 职场文书
收费员岗位职责
2015/02/14 职场文书
跳高加油稿
2015/07/21 职场文书