详解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 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
php中对2个数组相加的函数
Jun 24 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
php验证码的制作思路和实现方法
Nov 12 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
Thinkphp微信公众号支付接口
Aug 04 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP levenshtein()函数用法讲解
Mar 08 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
世界收音机发展史
2021/03/01 无线电
谈谈PHP的输入输出流
2007/02/14 PHP
ie6 动态缩略图不显示的原因
2009/06/21 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
php变量范围介绍
2012/10/15 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
Python端口扫描简单程序
2016/11/10 Python
Python面向对象程序设计示例小结
2019/01/30 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
会计毕业自我鉴定
2014/02/05 职场文书
Linux中文件的基本属性介绍
2022/06/01 Servers