ThinkPHP/Common/common.php 文件

I函数,主要用来获取一些gpc请求的变量的,函数有一部分代码是过滤变量的,每次都运行一次,其实是没有必要的。

如果你每次都像这样的方式调用的话:$a = I('post.a');$c = I('post.b');$c = I('post.c');过滤函数就会对$_POST数据进行3次重复的过滤,考虑到这个函数属于频繁调用的,可以优化一下。

优化方案,增加一个静态变量,将第一次运行后的数据存储起来,后续调用直接取出来就可以了,代码如下:

  1. //by zxm 行是我修改的代码部分
  2.  
  3. function I($name,$default='',$filter=null) {
  4. static $maps = array();//by zxm
  5. if(strpos($name,'.')) { // 指定参数来源
  6. list($method,$name) = explode('.',$name,2);
  7. }else{ // 默认为自动判断
  8. $method = 'param';
  9. }
  10. if(!isset($maps[$method])){//by zxm
  11. switch(strtolower($method)) {
  12. case 'get' : $input =& $_GET;break;
  13. case 'post' : $input =& $_POST;break;
  14. case 'put' : parse_str(file_get_contents('php://input'), $input);break;
  15. case 'param' :
  16. switch($_SERVER['REQUEST_METHOD']) {
  17. case 'POST':
  18. $input = $_POST;
  19. break;
  20. case 'PUT':
  21. parse_str(file_get_contents('php://input'), $input);
  22. break;
  23. default:
  24. $input = $_GET;
  25. }
  26. if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){
  27. $input = array_merge($input,$_GET[C('VAR_URL_PARAMS')]);
  28. }
  29. break;
  30. case 'request' : $input =& $_REQUEST; break;
  31. case 'session' : $input =& $_SESSION; break;
  32. case 'cookie' : $input =& $_COOKIE; break;
  33. case 'server' : $input =& $_SERVER; break;
  34. case 'globals' : $input =& $GLOBALS; break;
  35. default:
  36. return NULL;
  37. }
  38. // 全局过滤
  39. // array_walk_recursive($input,'filter_exp');
  40.  
  41. if(C('VAR_FILTERS')) {
  42. $_filters = explode(',',C('VAR_FILTERS'));
  43. foreach($_filters as $_filter){
  44. // 全局参数过滤
  45. array_walk_recursive($input,$_filter);
  46. }
  47. }
  48. $maps[$method] = $input;//by zxm
  49. }else{
  50. $input = $maps[$method];//by zxm
  51. }
  52.  
  53. if(empty($name)) { // 获取全部变量
  54. $data = $input;
  55. $filters = isset($filter)?$filter:C('DEFAULT_FILTER');
  56. if($filters) {
  57. $filters = explode(',',$filters);
  58. foreach($filters as $filter){
  59. $data = array_map($filter,$data); // 参数过滤
  60. }
  61. }
  62. }elseif(isset($input[$name])) { // 取值操作
  63. $data = $input[$name];
  64. $filters = isset($filter)?$filter:C('DEFAULT_FILTER');
  65. if($filters) {
  66. $filters = explode(',',$filters);
  67. foreach($filters as $filter){
  68. if(function_exists($filter)) {
  69. $data = is_array($data)?array_map($filter,$data):$filter($data); // 参数过滤
  70. }else{
  71. $data = filter_var($data,is_int($filter)?$filter:filter_id($filter));
  72. if(false === $data) {
  73. return isset($default)?$default:NULL;
  74. }
  75. }
  76. }
  77. }
  78. }else{ // 变量默认值
  79. $data = isset($default)?$default:NULL;
  80. }
  81. return $data;
  82. }

  

ThinkPHP函数I代码优化的更多相关文章

  1. ThinkPHP函数详解:session方法

    ThinkPHP函数详解:session方法 Session方法用于Session 设置.获取.删除和管理操作. Session 用于Session 设置.获取.删除和管理操作 用法    sessi ...

  2. ThinkPHP函数详解:C方法

    C方法是ThinkPHP用于设置.获取,以及保存配置参数的方法,使用频率较高.了解C方法需要首先了解下ThinkPHP的配置,因为C方法的所有操作都是围绕配置相关的.ThinkPHP的配置文件采用PH ...

  3. ThinkPHP函数详解:D方法

    从本篇开始,我们会陆续给大家详细说明下框架内置函数的用法. D方法 D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持 ...

  4. ThinkPHP函数详解:I方法

    ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用3.1快速入门教程系列的变量部分. 概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新 ...

  5. ThinkPHP函数详解系列

    为了能方便大家学习和掌握,在这里汇总下ThinkPHP中的经典函数用法 A 函数:实例化控制器R 函数:直接调用控制器的操作方法C 函数:设置和获取配置参数L 函数:设置和获取语言变量D 函数:实例化 ...

  6. thinkphp函数学习(0)——开篇

    因为新公司都使用thinkphp,所以就想通读一遍源码,可是在读的过程中,时常半路杀出个自定义函数,然后又要跳到函数定义的地方先看具体的函数定义,感觉特别的难受,好几次都是看到runtime.php就 ...

  7. thinkphp函数学习(3): C函数详解

    function C($name=null, $value=null,$default=null) { static $_config = array(); // 无参数时获取所有 if (empty ...

  8. ThinkPHP函数详解:U方法

    U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为:U('地址','参数','伪静态','是否跳转','显示域名');在模板中使用U方法而不是固定 ...

  9. ThinkPHP函数详解:M方法

    M方法用于实例化一个基础模型类,和D方法的区别在于:1.不需要自定义模型类,减少IO加载,性能较好:2.实例化后只能调用基础模型类(默认是Model类)中的方法:3.可以在实例化的时候指定表前缀.数据 ...

随机推荐

  1. Python3基础(5)常用模块:time、datetime、random、os、sys、shutil、shelve、xml处理、ConfigParser、hashlib、re

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  2. SQLServer数据库语句大全汇总

    目录清单CONTEXT LIST1.数据库DataBase 1.1数据库建立/删除create/drop database 1.2数据库备份与恢复backup/restore database2.数据 ...

  3. OracleJDK与OpenJDK的区别和联系

    OpenJDK原是SunMicrosystems公司为Java平台构建的Java开发环境(JDK)的开源版本,完全自由,开放源码.OracleJDK里面包含的JVM是HotSpotVM,HotSpot ...

  4. Django之model基础(查询补充)

    学习完简单的单表查询外,是远远不够的,今天我们对查询表记录做一个补充,接下来来看看基于对象的跨表查询.基于双下划线的跨表查询,聚合查询和分组查询,F查询与Q查询. 比如我们有如下一张表,在model中 ...

  5. 学习笔记:SVG和Canvas

    SVG SVG 与 Flash 类似,都是用于二维矢量图形,二者的区别在于,SVG 是一个 W3C 标准,基于 XML,是开放的.因为是 W3C 标准,SVG 与其他的 W3C 标准,比如 CSS.D ...

  6. mysql登陆远程数据库

    1.登陆mysql 2.e mysql; 3.比如用户名密码为root/root. 你想root使用root从任何主机连接到mysql服务器的话. @’ ’后面加ip地址一般般为localhost或者 ...

  7. C#运算符、控制流

    1 运算符 1.1 一元运算符: -(负号).+(正号):可以省略 1.2 二元运算符:     优先级,*(乘)./(除).%(取余).+(加).-(减).=(赋值) 二元赋值运算符,=.+=.-= ...

  8. Android应用瘦身

    转:https://zhuanlan.zhihu.com/p/25465537 瘦身的目的 从目的导向来看,我们是不会无缘无故去做一件事情的,那我们对应用瘦身的目的是为了什么?答案是:提高下载转化率. ...

  9. font:inherit

    font:inherit 字体的设置 设置所有元素的字体保持一致: 所有元素:*{font:inherit;} /* IE8+ */ body体用percent:body{font:100%/1 sa ...

  10. Oracle数据库基础--SQL查询经典例题

    Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用 本文使用的实例表结构与表的数据如下: emp员工表结构如下: ...