PHP 的 全局变量 global 和 超全局变量 $GLOBAL - 只需一篇你就明白

文章涉及到了 PHP 的 & 引用 ,转载自 http://blog.csdn.net/yanhui_wei/article/details/8246083

+++ 探讨(一)+++++++++++++++++++++++++++++++++++++++

很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。

根据官方的解释是

  • $GLOBALS[‘var‘] 是外部的全局变量$var本身。
  • global $var 是外部$var的同名引用或者指针。(错误:是个别名引用而已,非指针!!!)

举例说明一下:

<?php
$var1 = 1;
$var2 = 2;
function test() {
    $GLOBALS[‘var2‘] = &$GLOBALS[‘var1‘];
}

test();
echo $var2;
?>

正常打印结果为1

<?php
$var1 = 1;
$var2 = 2;

function test(){
    global $var1, $var2;
    $var2 = &$var1;
    echo $var2;
    $var2 = ‘qianyunlai.com‘;
}

test(); // 输出 1
echo $var2; // 输出 2
echo $var1; // 输出 qianyunlai.com
?>

test()函数中的$var1,$va2都是局部变量,只不过是加了global关键字后,分别引用指向全局变量$var1,$va2了,当 $var2 = &$var1; 时,局部变量$var2不再指向全局变量$val2,而重新指向全局变量$var1,换句话来说,局部变量$var2的改变,不会再影响到全局变量$val2,而会影响到重新指向的全局变量$val1。

我们再来看一个例子吧。

<?php
$var1 = 1;
function test(){
    unset($GLOBALS[‘var1‘]);
}
test();
echo $var1;
?>

因为$var1被删除了,所以什么东西都没有打印。

<?php
$var1 = 1;

function test(){
    global $var1;
    unset($var1);
}

test();
echo $var1;
?>

  

意外的打印了1。

证明删除的只是别名,$GLOBALS[‘var‘]的引用,起本身的值没有受到任何的改变。

明白了吧?

也就是说 global $var 其实就是$var = &$GLOBALS[‘var‘]。调用外部变量的一个别名而已。

+++ 探讨(二)++++++++++++++++++++++++++++++++++++++++++

PHP中global和$GLOBALS不仅仅是写法不一样以为,两者的区别还是很大的,在实际应用中需要注意!

先看下面的例子:

<?php
$id = 1;
function test() {
    global $id;
    unset($id);
}
test();
echo($id); // 输出 1
?>

  

引用定位

许多php的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。一些结构,例如引用传递和引用返回,已经在上面提到了。其它使用引用的结构有:

当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

<?php
$GLOBALS["var1"] = 1;
$var = &$GLOBALS["var1"];
unset($var);
echo $GLOBALS[‘var1‘]; //输出1
//############################################
$GLOBALS["var1"] = 1;
$var = &$GLOBALS["var1"];
unset($GLOBALS[‘var1‘]);
echo $var; //输出1
//############################################
//如果写成如下,则会出错
$GLOBALS["var"] = 1;
$var = &$GLOBALS["var"];
unset($GLOBALS[‘var‘]);
echo $var; //脚本没法执行
//###########################################
?>

  

这意味着,例如,unset $var 不会 unset 全局变量。

unset只是把只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。

使用isset($var)的时候返回 false。$this在一个对象的方法中,$this 永远是调用它的对象的引用。

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。

可以通过使用 $GLOBALS 数组避免这一点。

例 在函数内引用全局变量:

<?php
$var1 = "Example variable";
$var2 = "";

function global_references($use_globals) {
    global $var1, $var2;
    if (!$use_globals) {
       $var2 = &$var1; // visible only inside the function
    } else {
        $GLOBALS["var2"] = &$var1; // visible also in global context
    }
}

global_references(false);
echo "var2 is set to ‘$var2‘\n"; // var2 is set to ‘‘
global_references(true);
echo "var2 is set to ‘$var2‘\n"; // var2 is set to ‘Example variable‘

?>

把 global $var; 当成是 $var = &$GLOBALS[‘var‘]; 的简写。所以 如果将其它引用赋给 $var, 只改变了本地变量的引用。

如前所述,引用不是指针。这意味着下面的结构不会产生预期的效果:

<?php
$bar = 3;
function foo(&$var) {
    $GLOBALS["baz"] = 5;
    $var = &$GLOBALS["baz"];
}
foo($bar);
echo $bar;//输出3
?>

这将使 foo 函数中的 $var 变量在函数调用时和 $bar 绑定在一起,但接着又被重新绑定到了 $GLOBALS["baz"] 上面。

不可能通过引用机制将 $bar 在函数调用范围内绑定到别的变量上面,因为在函数 foo 中并没有变量 $bar(它被表示为 $var,但是 $var 只有变量内容而没有调用符号表中的名字到值的绑定)。可以使用引用返回来引用被函数选择的变量。

引用php手册的$GLOBALS的解释:

Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。

由所有已定义全局变量组成的数组。变量名就是该数组的索引。这是一个“superglobal”,或者可以描述为自动全局变量。

也就是说上面代码中的$var1和$GLOBALS[‘var1‘]是指的同一变量,而不是2个不同的变量!

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致。

<?php
$a = 1;
$b = 2;
function Sum() {
    global $a, $b;
    $b = $a + $b;
}
Sum();
echo $b;
?>

输出将是 “3″。在函数中申明 了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。

怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3。

时间: 2024-10-11 17:50:59

PHP 的 全局变量 global 和 超全局变量 $GLOBAL - 只需一篇你就明白的相关文章

超全局变量

今天想写的内容叫做超全局变量. 为什么会想写这个东西的知识呢?一点是这个知识的内容很容易和JS里面的知识弄混淆,还有一点就是自己上课的时候其实听得不是很清楚,课后复习的时候才弄懂的,所以也想做个笔记,以后也会清楚一点. 首先,想了解什么是超全局变量,我们先介绍一下局部变量和全局变量吧.因为这大概也算一个层次性的问题. 变量的作用域:变量的作用域,就是指一个变量在哪能用在哪不能用,也就是一个变量其作用的有效范围!   局部变量:在一个函数内部定义的变量,其作用范围就是局部作用域,该变量也叫作局部变

SSG (slow global), TTG (typical global) and FFG (fast global)

https://semiwiki.com/x-subscriber/clk-design-automation/4481-variation-alphabet-soup/ n response, foundries have broken out on-die variation as a separate component in their SPICE models. They created global corners for slow, typical and fast. These

vuex其实超简单,只需3步

前言 之前几个项目中,都多多少少碰到一些组件之间需要通信的地方,而因为种种原因,event bus 的成本反而比vuex还高, 所以技术选型上选用了 vuex, 但是不知道为什么,团队里的一些新人一听到vuex,就开始退缩了, 因为vuex 很难? 真的很难吗?今天我们用简单的3步来证明一下,vuex有多简单. 纯属个人经验,难免有不正确的地方,如有发现,欢迎指正! 这是一个针对新手的入门级教程.入门级教程.入门级教程 第零步 新建一个vue项目,安装vuex,这里不做过多介绍,能点进来的,默认

global关键字修改全局变量

#我们知道全局变量在函数外部,强烈建议不要在函数内部修改全局变量,正常情况下,在函数内部改变全局变量并不影响全局变量的值,举例如下 count = 5 >>> def myfun(): count = 10 #在函数内部修改了count print(count) >>> myfun() #调用myfun函数并执行,输出count值为1010>>> count #可见在外面的count值仍然不变.5>>> print (count)5

PHP 全局变量 - 超全局变量

PHP 全局变量 - 超全局变量 PHP 中的许多预定义变量都是"超全局的",这意味着它们在一个脚本的全部作用域中都可用.在函数或方法中无需执行 global $variable; 就可以访问它们. 这些超全局变量是: $GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION $GLOBALS - 引用全局作用域中可用的全部变量 $GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全

php全局变量 超全局变量

php中有许多超全局变量,这意味着它们在一个脚本的全部作用域中都可用.在函数或方法中无需执行 global $variable; 就可以访问它们. 这些超全局变量是: $GLOBALS    引用全局作用域中可用的全部变量 $_SERVER    这种超全局变量保存关于报头.路径和脚本位置的信息. 能够在 $_SERVER 中访问的最重要的元素: 元素/代码 描述 $_SERVER['PHP_SELF'] 返回当前执行脚本的文件名. $_SERVER['GATEWAY_INTERFACE'] 返

php中的$_REQUEST超全局变量

PHP $_REQUEST是用于收集HTML表单提交的数据,PHP $_REQUEST属于PHP的超级全局变量. 以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form). 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件. 在这个实例中,我们指定文件来处理表单数据.如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名. 然后,我们可以使用超级全局变量 

PHP中的$_SERVER超全局变量

详细参数 PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关. $_SERVER['argv'] #传递给该脚本的参数. $_SERVER['argc'] #包含传递给程序的命令行参数的个数(如果运行在命令行模式). $_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本.例如,“CGI/1.1”. $_

PHP中的超全局变量

PHP中的超全局变量 PHP中的超全局变量 从PHP 4.2.0 开始,register_globals 的默认值为 off,这样一来,以前的很多可以直接使用的变量,如 $PHP_SELF 或者你设定的SESSION变量都不能用 “$变量名”的形式访问了,这可能会给你带来很多不变,但却有助于安全性的提高.访问这些变量,你需要使用PHP 超全局变量,如下: $_SERVER 变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联.类似于旧数组 $HTTP_SERVER_VARS 数组.以前的