详解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中通过ADO调用Asscess数据库和COM程序
Oct 09 PHP
如何使用PHP往windows中添加用户
Dec 06 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
PHP动态创建Web站点的方法
Aug 14 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
PHP使用递归算法无限遍历数组示例
Jan 13 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
用PHP的反射实现委托模式的讲解
Mar 22 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
用Python创建声明性迷你语言的教程
2015/04/13 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
scrapy爬虫完整实例
2018/01/25 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
电大毕业生自我鉴定
2013/11/10 职场文书
学生实习证明范文
2014/09/28 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
python 对图片进行简单的处理
2021/06/23 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL
无线电通信名词解释
2022/02/18 无线电