详解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初学者头痛的十四个问题
Jul 12 PHP
在php中取得image按钮传递的name值
Oct 09 PHP
使用eAccelerator加密PHP程序
Oct 03 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
Nov 30 PHP
PHP下escape解码函数的实现方法
Aug 08 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
Dec 15 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
session 加入redis的实现代码
Jul 15 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
php微信开发之关键词回复功能
Jun 13 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实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
js实现交通灯效果
2017/01/13 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
《孙权劝学》教学反思
2014/04/23 职场文书
阅兵口号
2014/06/19 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL