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的PHP XML类
Oct 09 PHP
php通用防注入程序 推荐
Feb 26 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
php数组去重的函数代码
Feb 03 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
PHP实现的简单缓存类
Jul 29 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
TP5框架安全机制实例分析
Apr 05 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
function.inc.php超越php
2006/12/09 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
谈谈PHP的输入输出流
2007/02/14 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
Smarty保留变量用法分析
2016/05/23 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
简述JS控制台的使用
2018/07/15 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
python实现树形打印目录结构
2018/03/29 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
Django 限制访问频率的思路详解
2019/12/24 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
英语系本科生个人求职信
2013/09/21 职场文书
实习教师个人的自我评价
2013/11/08 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
认真学习保证书
2015/02/26 职场文书
监理中标通知书
2015/04/16 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
新郎新娘致辞
2015/07/31 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server