详解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 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
Aug 20 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
php实现的mongodb操作类实例
Apr 03 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
PHP实现倒计时功能
Nov 16 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解析json数据实例
2014/08/19 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
深入理解Django中内置的用户认证
2017/10/06 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
模具设计与制造专业应届生求职信
2013/10/18 职场文书
个人评价范文分享
2014/01/11 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
中央空调节能方案
2014/06/15 职场文书
跑出一片天观后感
2015/06/08 职场文书
小学英语教师研修感悟
2015/11/18 职场文书