详解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 REMOTE_ADDR之获取访客IP的代码
Apr 22 PHP
PHP通用分页类page.php[仿google分页]
Aug 31 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php daddslashes()和 saddslashes()有哪些区别分析
Oct 26 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
zend framework配置操作数据库实例分析
2012/12/06 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
写给女朋友的道歉信
2014/01/08 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
白鹤梁导游词
2015/02/06 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery