作用域:变量(或常量)能够被访问的区域
变量可以在普通代码中定义,也可以在函数内部定义,那么他们有什么区别呢?在php中变量按作用域来分总共分三种:
1、全局变量:用户普通定义的变量(函数外部定义)
所属全局空间:默认代码空间,在php中只允许在全局空间使用(理论上函数内部不可访问)
脚本周期:直到脚本运行结束(最后一行代码执行完)
2、局部变量:就是在函数内部定义的变量(所有形参都可以理解为局部变量)
所属当前函数空间:在php中只允许在当前函数自己内部使用
函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行)
3、超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等)
所属超全局空间:没有访问限制(函数内外都可以访问)
注意:
1、全局变量不能在局部空间使用
2、局部变量不能在全部空间使用
3、超全局变量没有访问限制
那么问题来了,如何能够实现全局变量访问局部空间,同时局部变量也可以访问全局空间?
1、参数传值、引用返回传值
通过参数传值上一节已经介绍,函数返回(传值调用/传址调用)/函数引用返回
2、$GLOBALS['变量名'] = value(值)
超全局变量会将全局变量自动纳入到$GLOBALS数组里面,而GLOBALS没有作用域限制,所以能够帮助局部空间去访问全局变量
<?php
b();
function b()
{
a();
echo $a; //$a未定义
var_dump($GLOBALS['key']); // 999
$GLOBALS['key'] = 888;
}
function a()
{
$GLOBALS['key'] = 999;
$a = 4;
}
var_dump($GLOBALS['key']); // 888
echo $a; //$a未定义
?>
注意:$GLOBALS必须使用数组的方式
3、global关键字:在函数内部定义变量的一种方式
基本语法:
global 变量名; //不能赋值
变量名 = 值;
①、如果使用global定义的变量名在外部存在(全局变量存在该变量名),那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一个变量),格式为:
global 变量名; //不能赋值
<?php
$test = 'hello,world'; //编译结果:hello,world
abc(); // hello,php
function abc()
{
global $test;
echo $test;
$test = 'hello,php';
}
echo "\n".$test;
?>
②、如果使用global定义的变量名在外部不存在(全局变量不存在该变量名),系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量,格式为:
global 变量名; //不能赋值
变量名 = 值;
<?php
$a = 10;
abc();
function abc()
{
global $b;
$GLOBALS['c']=8;
$b = 6;
}
echo "\n".$a+$b+$c; //24
?>
本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有
虽然以上方式可以实现局部与全局的互访,但是通常不会这么用,一般如果存在特殊使用,使用参数的形式来访问(还可以使用常量:define 定义)