详解php中反射的应用


Posted in PHP onMarch 15, 2016

反射是在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
      反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。
      通过ReflectionClass,我们可以得到Person类的以下信息:

     1)常量 Contants
     2)属性 Property Names
     3)方法 Method Names静态
     4)属性 Static Properties
     5)命名空间 Namespace
     6)Person类是否为final或者abstract 

然后就去看了看thinkphp的源码,对于MVC的实现也有不同的体验  ThinkPHP\Lib\Core\App.class.php 中的exec方法

if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
    // 非法操作
    throw new ReflectionException();
   }
   //执行当前操作
   $method = new ReflectionMethod($module, $action); #查看方法
   if($method->isPublic()) {
    $class = new ReflectionClass($module); #反射控制器
    // 前置操作
    if($class->hasMethod('_before_'.$action)) {
     $before = $class->getMethod('_before_'.$action);
     if($before->isPublic()) {
      $before->invoke($module);
     }
    }
    // URL参数绑定检测
    if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
     switch($_SERVER['REQUEST_METHOD']) {
      case 'POST':
       $vars = $_POST;
       break;
      case 'PUT':
       parse_str(file_get_contents('php://input'), $vars);
       break;
      default:
       $vars = $_GET;
     }
     $params = $method->getParameters();
     foreach ($params as $param){
      $name = $param->getName();
      if(isset($vars[$name])) {
       $args[] = $vars[$name];
      }elseif($param->isDefaultValueAvailable()){
       $args[] = $param->getDefaultValue();
      }else{
       throw_exception(L('_PARAM_ERROR_').':'.$name);
      }
     }
     $method->invokeArgs($module,$args);
    }else{
     $method->invoke($module); #执行我们需要调用函数
    }
    // 后置操作
    if($class->hasMethod('_after_'.$action)) {
     $after = $class->getMethod('_after_'.$action);
     if($after->isPublic()) {
      $after->invoke($module);
     }
    }

以上就是关于php中反射的应用,希望对大家理解学习php反射有所帮助。

PHP 相关文章推荐
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
php+mysql事务rollback&commit示例
Feb 08 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
php实现的微信红包算法分析(非官方)
Sep 25 PHP
给WordPress中的留言加上楼层号的PHP代码实例
Dec 14 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
浅谈PHP各环境下的伪静态配置
Mar 13 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 PHP
php实现图片上传并进行替换操作
Mar 15 #PHP
php模板引擎技术简单实现
Mar 15 #PHP
9个比较实用的php代码片段
Mar 15 #PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 #PHP
php图片添加文字水印实现代码
Mar 15 #PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 #PHP
Yii rules常用规则示例
Mar 15 #PHP
You might like
小偷PHP+Html+缓存
2006/11/25 PHP
php输入流php://input使用浅析
2014/09/02 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
特殊日期提示功能的实现方法
2016/06/16 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
python验证码识别教程之滑动验证码
2018/06/04 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
python变量的存储原理详解
2019/07/10 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
运行时异常与一般异常有何异同?
2014/01/05 面试题
计算机软件个人的自荐信范文
2013/12/01 职场文书
关于迟到的检讨书
2014/01/26 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
高二政治教学反思
2014/02/01 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
党员公开承诺事项
2014/03/25 职场文书
2014年仓库工作总结
2014/11/20 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers