详解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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
php封装一个异常的处理类
Jun 08 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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
谈一谈收音机的高放电路
2021/03/02 无线电
一个目录遍历函数
2006/10/09 PHP
关于js datetime的那点事
2011/11/15 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
webpack3之loader全解析
2017/10/26 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
Python通过future处理并发问题
2017/10/17 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
浅析使用Python搭建http服务器
2019/10/27 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
汉语言文学专业自荐信
2014/06/11 职场文书