PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖, 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。PHP 中全局变量在函数中使用时必须申明为全局(注意,Global这个关键字在函数中定义才有用)
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖,
这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。PHP
中全局变量在函数中使用时必须申明为全局(注意,Global这个关键字在函数中定义才有用)。
1:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
1 2 3 4 5 6 7 8 | <?PHP $a =123;
function aa()
{
Global $a ;
echo $a ;
}
aa();
?>
|
Copy after login
总结:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $global $a ;
$a =123;
function f()
{
echo $a ;
}
function f()
{
global $a ;
$a =123;
}
f();
echo $a ;
|
Copy after login
2:global问题解析:
question:我在 config.inc.php中定义了一些变量($a),在别的文件中函数外部 include("config.inc.php"),函数内部需要使用这些变量$a,如果没有声明的话,echo $a是打印不出来任何东西的。因此声明global
$a,但是有很多函数和很多变量,总不能不断重复的这样声明吧?有什么好的解决办法,请指点。
answer1:先在config.inc.php里定义常量:define(常量名,常量值)
再在其他需要用到的地方require 'config.inc.php',
然后就能在这个文件里直接使用这个常量了。
answer2:我也有个办法,就是定义数组,如$x[a],$x,那样就只要声明global $x一个了。
answer3:我试了你的这个方法,不行啊。
answer4:改你的php.ini文件。
3.一些Global和$GLOBALS 数组的例子
例子:使用 global
1 2 3 4 5 6 7 8 | <?PHP $w3sky = 1;
$w3sky2 = 2;
function Sum()
{
global $w3sky , $w3sky2 ; $w3sky2 = $w3sky + $w3sky2 ;
}Sum();
echo $w3sky2 ;
?>
|
Copy after login
以上脚本的输出将是“3”。在函数中申明了全局变量 $w3sky 和 $w3sky2,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成:
例子 使用 $GLOBALS 替代 global
1 2 3 4 5 6 7 | <?PHP $w3sky = 1;
$w3sky2 = 2; function Sum()
{
$GLOBALS [ 'w3sky' ] = $GLOBALS [ 'w3sky' ] + $GLOBALS [ 'w3sky2' ];
}Sum();
echo $w3sky2 ;
?>
|
Copy after login
在 $GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处:
例子 演示超全局变量和作用域的例子
1 2 3 4 5 6 7 | <?PHP function test_global()
{
global $HTTP_POST_VARS ; echo $HTTP_POST_VARS [ 'name' ];
echo $_POST [ 'name' ];
}
?>
|
Copy after login
global
也就是说在一个文件里 只要你声明为global $db 那么在声明的下面 你就可以引用这个$db了。
4.原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的!
先看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php
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" ;
test_globals();
print $var3 . "\n" ;
?>
|
Copy after login
复制代码
执行结果为:
0
5
怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?
恩,我们保留以上问题,深入分析$GLOBALS和global的原理!
我们都知道变量其实是相应物理内存在代码中的"代号",假设我们上面声明的3个变量分配的内存如下图表示:
引用php手册的$GLOBALS的解释:
Global 变量:$GLOBALS
注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。
由所有已定义全局变量组成的数组。变量名就是该数组的索引。
这是一个“superglobal”,或者可以描述为自动全局变量。
也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!
下面来分析global到底做了什么?
我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:
1 2 3 4 5 6 7 8 9 | <?php
function test() {
global $a ;
unset( $a );
}
$a = 1;
test();
print $a ;
?>
|
Copy after login
复制代码
执行结果为:
1
为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入