zoukankan      html  css  js  c++  java
  • 超全局变量$GLOBALS

    转载自 https://www.freebuf.com/column/230907.html

    PHP中有一个鲜为人知的超全局变量$GLOBALS。

    $GLOBALS定义:引用全局作用域中可用的全部变量(一个包含了全部变量的组合数组。变量的名字就是数组的键),与所有其他超全局变量不同,$GLOBALS在PHP代码中的任何地方都是可用的,可以通过打印$GLOBALS变量查看结果验证。

    在PHP生命周期中,定义在函数体外部的全局变量,函数内部是不能直接获得的。如果要在函数体内访问外部定义的全局变量,可以通过global声明或者直接使用$GLOBALS来进行访问。

    比如:

    <?php
    $var1='www.tidesec.com';
    $var2='www.tidesec.net';
    test();
    function test(){
    $var1='tide';
    echo $var1,'<br />';
    global $var1;
    echo $var1,'<br />';
    echo $GLOBALS['var2'];
    }
    

    输出结果为:

    tide
    www.tidesec.com
    www.tidesec.net
    

    其中global和$GLOBALS的区别:

    $GLOBALS['var']是外部全局变量的本身,而global $var则是外部$var的同名引用或者说是指针,也就是说global函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,而$GLOBALS[]确确实实调用的是外部的变量,函数内外都会始终保持一致。

    举个例子:

    $var1=tide;
    $var2=tidesec;
    function test(){
    $GLOBALS['var2']=&$GLOBALS['var1'];
    }  
    test();
    echo $var2;
    

    结果为:

    tide
    

    $var1=tide;
    $var2=tidesec;
    function test(){
    global $var1,$var2
    $var2=&$var1;
    }  
    test();
    echo $var2;
    
    

    结果为:

    tidesec
    

    结果之所以为tidesec,原因为$var1的引用指向了$var2的引用地址。导致实质的值没有发生变化。


    $var1=tide;
    function test(){
    global $var1;
    unset($var1);
    }  
    test();
    echo $var1;
    

    结果为:

    tide
    

    这就说明,删除的只是别名或者说是引用,其本身作用的值没有受到任何的影响。也就是说,global $var其实是$var = &$GLOBALS['var'],调用外部变量的一个别名而已。

  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/NPFS/p/12721175.html
Copyright © 2011-2022 走看看