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中变量及部分适用方法
Mar 27 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
windows平台中配置nginx+php环境
Dec 06 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
基于php双引号中访问数组元素报错的解决方法
Feb 01 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
浅谈php的TS和NTS的区别
Mar 13 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python中定义结构体的方法
2013/03/04 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
营销与策划个人求职信
2013/09/22 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
英文导游词
2015/02/13 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang