变量作用域
变量的作用域即它定义的上下文背景,也就是它的生效范围。在php中,关于变量作用域有以下六条规则:
-
内置的超全局变量在脚本的任何地方都可见,比如$_GET, $_POST, $_REQUEST等。
-
常量,一旦定义,全局可见,它们可以在函数内部或外部被使用。
-
脚本中定义的全局变量在整个脚本中可见,但在函数内部不可见。如果想在函数内部也可见,需要使用
global
声明该变量。 -
在函数内部创建的变量只在函数内可见,当函数运行结束时,该局部变量的作用域终结。
-
在函数内部创建的变量如果使用
static
进行了修饰,那么该变量虽然从函数外部不可见,但是在函数运行结束时该变量并没有终结,而是能够保持它的值,等待下一次的函数执行。
超全局变量
在PHP中,为了使用上的方便,内置了一些超级全局变量,这些超全局变量是在全部作用域中始终可用的内置变量。下面是php中支持的超全局变量的列表:
-
$GLOBALS: 包含脚本中所有自定义的全局变量的数组。使用该全局数组可以替代函数中的
global
修饰符,让你在函数中访问这些全局变量,比如$GLOBALS['myvariabl']。 -
$_SERVER: 包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
-
$_GET: 包含通过GET方法提交给php脚本的所有变量的数组。
-
$_POST: 包含通过POST方法提交给php脚本的所有变量的数组。
-
$_COOKIE: 包含cookie变量的数组。
-
$_FILES: 包含上传文件相关的变量的数组。
-
$_ENV: 通过环境方式传递给当前脚本的变量的数组。
-
$_REQUEST: 包含了$_GET, $_POST, $_COOKIE三个数组信息的大数组。
-
$_SESSION: 当前脚本可用 SESSION 变量的数组。
global关键字
在php中,函数是一个重要的作用域范围,一定要理解清楚不同的变量类型在函数内和函数外作用域区别。
比如下面的代码:
<?php
$a = 1; /* global scope */
function Test()
{
echo $a; /* local scope variable */
}
Test();
?>
这段php脚本执行后没有任何输出。可能我们会想当然的认为函数内部使用的$a就是外面定义的全局变量$a,但php的运行机制并非如此。函数内部的$a是一个完全独立于外部全局变量$a的局部变量,而且因为没有被赋值,所以输出为空。而在C语言中,全局变量在函数内部自动生效,除非你又定义了一个局部变量覆盖了它。
那么这种情况,要想在函数内部使用外部的全局变量,就需要global
关键字出场了。看下面的代码:
<?php
$a = 1; /* global scope */
function Test()
{
global $a;
echo $a; /* refer to global scope variable */
}
Test();
?>
这段php脚本执行后输出1,可见使用了global
关键字后,函数内部的$a指向了外部的全局变量。
如果不使用global
关键字,达到相同的效果,也可以使用PHP内置的超全局变量$GLOBALS,修改后代码如下:
<?php
$a = 1; /* global scope */
function Test()
{
echo $GLOBALS['a'];
}
Test();
?>
执行这个脚本后,同样输出1。
网友评论