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 中的类
Oct 09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php方法调用模式与函数调用模式简例
Sep 20 PHP
深入PHP FTP类的详解
Jun 13 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
PHP模板解析类实例
Jul 09 PHP
PHP实现的简单缓存类
Jul 29 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
Yii2框架redis基本应用示例
Jul 13 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函数代码
2013/08/29 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
关于PHP开发的9条建议
2015/07/27 PHP
菜单效果
2006/10/14 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
Python爬虫实例扒取2345天气预报
2018/03/04 Python
Django实现学生管理系统
2019/02/26 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
运行Python编写的程序方法实例
2020/10/21 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
网上蛋糕店创业计划书
2014/01/24 职场文书
高中历史教学反思
2014/02/08 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
物流管理专业求职信
2014/05/29 职场文书
通信工程专业求职信
2014/06/04 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
导游词之日月潭
2019/11/05 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
Java设计模式之代理模式
2022/04/22 Java/Android
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android