全局变量:主程序中定义的变量(函数外部),只能在主程序中使用,在函数内部不能调用
背景:解决在函数内部调用全局变量的问题
解决方法:
1.在函数内部声名全局变量
<?php public $var=1; function fun(){
global $var; echo $var; } ?> 输出 1
2.使用$GLOBALS超全局数组
<?php $var=1; function fun(){ echo $GLOBALS['var']; } fun(); ?> 输出 1
原理分析:
$GLOBALS['var']是外部的全局变量本身
global $var是对外部$var的同名变量的引用或者指针,并不是真正的赋值
验证:
<?php
$var1 = 1;
function test(){
global $var1;
unset($var1);
}
test();
echo $var1;
?>
输出1
说明删除的只是函数内部的变量(即对外部变量别名的引用),外部的变量不影响
再如:
<?php $var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1; ?> 无输出
变量不存在 把全局变量给删除了
深入剖析:
<?php function test_global() { global $var1, $var2; $var2 =& $var1; //引用了一个新的指向,所以现在$var2已经不是全局变量,只是函数内部的变量,对外部的全局变量没影响 只有赋值才会改变外部全局 变量的值 echo $var2; 5 } function test_globals() { $GLOBALS['var3'] =& $GLOBALS['var1']; //相当于对原有全局变量一个引用,值会改变 } $var1 = 5; $var2 = $var3 = 0; test_global(); //输出5 print $var2 ."\n"; //输出0 test_globals(); print $var3 ."\n"; //输出5 ?> 输出 5 0 5
总结:
1.global $var是对外部$var的同名变量的引用或者指针,且只有赋值才会改变全局变量的值,若为引用($var2 =& $var1;)只适用于函数内部
2.$GLOBALS['var']是外部的全局变量本身,在函数内部可以使用$GLOBALS数组调用
3.作用域:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
$GLOBALS超全局数组适用于任何地方
4.在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,
<?php $var1 = 5; function test_global() { global $vars; $vars='red'; echo $vars."\n"; } test_global(); echo $vars; ?>
5.可以使用$GLOBALS超全局数组调用系统中的所有变量和常量以及对象和对象中的属性变量值
$GLOBALS['ecs'] => ECS Object $ecs 调用对象
$GLOBALS['_SERVER']=> $_SERVER全局变量数组 调用超全局变量$_SERVER数组
$GLOBALS['ecs']['db_name'] => ECS Object 调用ecs对象里面定义的变量 $db_name
$GLOBALS['ecs']->table('shop_config') ecs对象的table方法() 调用ecs对象里面定义的table函数