变量作用域
变量的作用域即它定义的上下文背景,也就是它的生效范围。在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就是外面定义的全局变量$a,但php的运行机制并非如此。函数内部的$a是一个完全独立于外部全局变量$a的局部变量,而且因为没有被赋值,所以输出为空。而在C语言中,全局变量在函数内部自动生效,除非你又定义了一个局部变量覆盖了它。
那么这种情况,要想在函数内部使用外部的全局变量,就需要global
关键字出场了。看下面的代码:
这段php脚本执行后输出1,可见使用了global
关键字后,函数内部的$a指向了外部的全局变量。
如果不使用global
关键字,达到相同的效果,也可以使用PHP内置的超全局变量$GLOBALS,修改后代码如下:
执行这个脚本后,同样输出1。