`
iwebcode
  • 浏览: 2071931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

PHP5+引进$GLOBALS延迟初始化的概念

 
阅读更多
  作者:zhanhailiang 日期:2013-01-18

今天整理代码想使用$GLOBALS['_SERVER']来替代$_SERVER来访问相关的环境变量,总是会报“_SERVER undefined”错误。如下用例:

用例1:

<?php

print_r($GLOBALS);

此时输出中并没有_SERVER相关信息:

Array
(
    [GLOBALS] => Array
 *RECURSION*
    [_POST] => Array
        (
        )

    [_GET] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )
)

用例2:

<?php

print_r($GLOBALS);
print_r($_SERVER);

此时输出中含有_SERVER相关信息:

Array
(
    [GLOBALS] => Array
 *RECURSION*
    [_POST] => Array
        (
        )

    [_GET] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )

    [_SERVER] => Array
        (

        )

)

查了下PHP手册关于$GLOBALS描述,引用therandshow at gmail dot com的评论:

therandshow at gmail dot com
As ofPHP5.4 $GLOBALS is now initialized just-in-time. This means there now is an advantage to not use
the $GLOBALS variable as you can avoid the overhead of initializing it. How much of an advantage that is
I'm not sure, but I've never liked $GLOBALS much anyways.

追根数源,发现PHP5Changelog更新日志的描述:

Unordered List ItemImproved Zend Engine, performance tweaks and optimizations
Unordered List ItemChanged $GLOBALS into a JIT autoglobal, so it's initialized only if used. (this may affect opcode caches!)
 718 ; When enabled, the SERVER and ENV variables are created when they're first
 719 ; used (Just In Time) instead of when the script starts. If these variables
 720 ; are not used within a script, having this directive on will result in a
 721 ; performance gain. The PHP directives register_globals, register_long_arrays,
 722 ; and register_argc_argv must be disabled for this directive to have any affect.
 723 ; http://php.net/auto-globals-jit
 724 auto_globals_jit = On

终于弄明白了,PHP5+中在开启auto_globals_jit = On情况下,$_SERVER变量和$_ENV变量不会在脚本启动时就创建,而是会在第一次使用$SERVER和$ENV时才会创建。所以就会出现上述两个用例的情况。

备注:

实测结论:

auto_globals_jit setting is also affecting $_REQUEST superglobal in 5.3 It is not explicitly stated in documentation.
至少5.3.13版本中开启auto_globals_jit = On情况下,$_REQUEST也只会在第一次使用时才会创建。
分享到:
评论

相关推荐

    全局变量中$GLOBALS['']和global的区别

    然而,当我们需要在函数内部使用全局变量时,有两种方式可以实现:`global`关键字和`$GLOBALS`数组。虽然两者都能访问全局变量,但它们在用法和效果上有所不同。 首先,`global`关键字是用来在函数内部引用全局变量...

    PHP语言中global和$GLOBALS[]的分析 之二

    在PHP编程语言中,`global`关键字和`$GLOBALS`数组是两个与全局变量相关的概念,它们虽然都与全局变量打交道,但在使用上有所区别。本文将继续深入分析这两个概念。 首先,`global`关键字用于在函数内部访问和操作...

    PHP中$GLOBALS[HTTP_RAW_POST_DATA]和$_POST的区别分析

    在PHP编程中,HTTP请求方式主要有GET和POST,而在处理POST数据时,开发者可能会遇到两种全局变量:`$_POST`和`$GLOBALS['HTTP_RAW_POST_DATA']`。这两个变量都与HTTP POST请求中的数据有关,但它们在使用场景和功能...

    PHP中$GLOBALS与global的区别详解

    PHP中$GLOBALS和global都可以实现全局变量的功能,所以很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。$GLOBALS 是一个超级全局变量,其实是一个数组,而global 则是一个声明全局变量的关键字! 一、...

    全网首发软件库系统--软件应用推广利器+PC端手机端自适应

    5、应用TAB三种样式任君选择,卡片、列表、大图; 6、应用直连/内页,两种跳转模式自由切换; 7、网址直连/内页,两种跳转模式自由切换; 8、所有模块均自带独立广告位,变现能力拉满; 9、适配谷歌浏览器沉浸式...

    PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】 <font color=red>原创</font>

    echo $GLOBALS['a'] + $GLOBALS['b']; // 输出3 } ``` 在这个例子中,我们通过$GLOBAL数组访问全局变量$a和$b,并输出它们的和。 #### 示例2:$GLOBALS数组与global关键字等价 ```php &lt;?php $a = 1; test ...

    php中global和$GLOBALS[]的分析之一

    总结,理解和正确使用`global`关键字以及`$GLOBALS`数组是PHP编程中重要的概念,它们在处理全局变量时提供了灵活性,但过度依赖全局变量可能会导致代码难以维护和调试。因此,建议尽量减少全局变量的使用,提高代码...

    PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析

    在上面的示例中,我们创建了两个全局变量$x和$y,并在函数`addition()`内部使用$GLOBALS数组来访问并计算它们的和,然后将结果存储回$z。这样,即使在函数内部,我们也能修改或读取全局变量的值。这种方法在处理跨...

    WindowsXP+IIS+PHP5+MySQL5+Zend+GD库+phpMyAdmin+PHPWind 5.3 安装教程

    ### WindowsXP + IIS + PHP5 + MySQL5 + Zend + GD库 + phpMyAdmin + PHPWind 5.3 安装教程精要 #### 一、准备工作与环境搭建 在开始构建一个完整的Web开发环境之前,确保你的电脑上已经安装好了Windows XP操作...

    phpweb首页关键词后台填写

    $GLOBALS['GLOBALS']['PSET']['metacon']=$GLOBALS["CONF"]["memo"]; $GLOBALS['GLOBALS']['PSET']['metakey'] =$GLOBALS["CONF"]["keywords"]; $GLOBALS['GLOBALS']['PSET']['pagetitle'] =$GLOBALS["CONF"][...

    php多次include后导致全局变量global失效的解决方法

    这在开发模块化应用时非常有用,可以帮助我们按需引入不同的功能模块。然而,如果在多个文件中连续使用`include`,而最后引入的文件中的函数又想通过`global`关键字引用之前定义的全局变量时,可能会遇到变量值为`...

    PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析

    主要介绍了PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别,结合具体实例形式分析了$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的功能与使用过程中的区别,需要的朋友可以参考下

    ThinkPHP3.2.3完全开发手册.zip

    官网下载版本提供了完整版和核心版两个版本,核心版本只保留了核心类库和必须的文件,去掉了所有的扩展类库和驱动,支持标准模式和SAE模式。3.2版本也支持composer安装,确保你的电脑已经安装了composer。

    PHP中全局变量global和$GLOBALS[]的区别分析

    在PHP中,全局变量的使用是经常出现的一个话题,尤其是涉及到在函数内部访问或者修改全局作用域中定义的变量时,开发者通常需要使用global关键字或者访问一个特殊的全局数组$GLOBALS。标题中提到的“global和$...

    企孟CRM客户管理系统 v2.0.0

    通过宝塔或者phpstudy建立站点,将程序解压后上传至站点根目录,浏览器打开站点网址进行初始化设置。 初始管理员用户名和密码为安装时设定的! 如需重新安装系统,请删除install目录下的install.lock文件,重新...

Global site tag (gtag.js) - Google Analytics