详解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 相关文章推荐
php5数字型字符串加解密代码
Apr 24 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
Mar 15 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
php中批量替换文件名的实现代码
Jul 20 PHP
php中长文章分页显示实现代码
Sep 29 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
Jun 06 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
php之static静态属性与静态方法实例分析
Jul 30 PHP
php查询操作实现投票功能
May 09 PHP
php使用crypt()函数进行加密
Jun 08 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 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编程开发“虚拟域名”系统
2006/10/09 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
javascript模块化简单解析
2016/04/07 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
Python获取任意xml节点值的方法
2015/05/05 Python
探究python中open函数的使用
2016/03/01 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
社区母亲节活动记录
2014/03/06 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
求职简历自我评价范文
2015/03/10 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
甲午风云观后感
2015/06/02 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL