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'],调用外部变量的一个别名而已。

  • 相关阅读:
    键盘过滤驱动
    多线程和多进程的差别(小结)
    Android UI设计规则
    怎样使用SetTimer MFC 够具体
    Chord算法(原理)
    POJ 1384 Piggy-Bank 背包DP
    Bulk Insert命令具体
    hibernate官方新手教程 (转载)
    教你用笔记本破解无线路由器password
    转换流--OutputStreamWriter类与InputStreamReader类
  • 原文地址:https://www.cnblogs.com/NPFS/p/12721175.html
Copyright © 2011-2022 走看看