详解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 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
web方式ftp
Oct 09 PHP
wordpress之wp-settings.php
Aug 17 PHP
又一个php 分页类实现代码
Dec 03 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
PHP与以太坊交互详解
Aug 24 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
深入解析contentWindow, contentDocument
2013/07/04 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python批量转换文件编码格式
2015/05/17 Python
Python实现简单多线程任务队列
2016/02/27 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
python如何获取服务器硬件信息
2017/05/11 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python实现单链表的方法示例
2019/09/03 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
Django 再谈一谈json序列化
2020/03/16 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
借名购房协议书范本
2014/10/06 职场文书
教师考核表个人总结
2015/02/12 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
2019军训心得体会
2019/06/27 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书