详解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 相关文章推荐
据说是雅虎的一份PHP面试题附答案
Jan 07 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
smarty模板引擎中自定义函数的方法
Jan 22 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 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中使用临时表查询数据的一个例子
2013/02/03 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
python去除所有html标签的方法
2015/05/05 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
EM算法的python实现的方法步骤
2018/01/02 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
python 二维数组90度旋转的方法
2019/01/28 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
Python 线程池用法简单示例
2019/10/02 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
Python更换pip源方法过程解析
2020/05/19 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Numpy数组的广播机制的实现
2020/11/03 Python
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
联谊活动总结范文
2015/05/09 职场文书
2015年除四害工作总结
2015/07/23 职场文书
健康教育主题班会
2015/08/14 职场文书
合同补充协议书
2016/03/24 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python