今天在lamp 2群中有人问面试题。。就是关于 global的。。还有个 & 符号。
很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。
根据官方的解释是
1.$GLOBALS['var']是外部的全局变量本身
2.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;
- }
- test();
- echo $var2;
- ?>
意外打印结果为2
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 ."\n";
echo $GLOBALS['var3'];
test_globals();
print $var3 ."\n";
?>
也就是说上面代码中的 $var1 和 $GLOBALS['var1'] 是指的同一变量,而不是2个不同的变量!
global 申明在函数中的变量其实还是个局部变量,在函数里面其实还是个变量的 别名变量。。
记得一句话。函数中的变量都是局部变量。
所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,
$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致!