# 变量作用域 [TOC] >[success] 变量作用的范围(可以被使用的范围)称为变量作用域,按作用域,可以将PHP变量分为超全局变量、全局变量和局部变量 局部变量:在函数内部声明的变量,就是局部变量,当函数执行完毕,**局部变量就消失了**。局部变量,**只能在函数内部使用**。 全局变量:在函数外部声明的变量,就是全局变量。在PHP中全局变量,**在函数中不能使用**,网页执行完毕,全局变量消失。 超全局数组变量:系统定义的变量,就是超全局变量。**该变量可以在任何地方直接使用**。 >[info] static静态变量:使用static修饰符修饰的变量就称之为静态变量,在我们变量作用域当中,函数执行完成函数体内的变量自动销毁,使用了static修饰符,可以把函数执行完成后的变量保留起来,在外部还可以继续的使用 >[danger] 注意:PHP变量作用域,与JS变量作用不一样。JS的全局变量可以直接在函数内部使用;而PHP的全局变量在函数内部不能直接使用 ## global关键字 在变量作用域的情况下,我们在函数体的内部想使用函数体外部的全局变量怎么办呢? PHP为我们提供了global关键字解决函数内部作用域的问题,从而让我们可以使用函数体外部的全局变量。 global关键字需要注意的事项: * [ ] global关键字,**只能在函数内部申明变量** * [ ] global关键字,**申明时不能赋值,必须申明之后才可以进行赋值操作** * [ ] global的作用,是引用传递地址,将全局变量的地址,传递到函数内部 * [ ] global关键字,**在函数内部,使用unset()删除 global引用的变量时,将不会影响到全局变量** ``` <?php $a = 100; function get() { global $a; # 正确操作 global $a = 200; # 报错,必须先声明在赋值 unset($a);# 删除是引用的值,不会影响函数外部变量 echo $a;# 如果直接使用那么就会报错,删除变量后函数体内部打印会报错 } get(); ``` ## 超全局数组变量$GLOBALS $GLOBALS可以引用全局作用域中可用的全部变量 * [ ] 如果在函数内部,使用unset可以删除一个全局变量,会影响到全局变量 * [ ] 通过$GLOBALS可以添加一个全局变量 ``` <?php $a = 100; function get() { $GLOBALS['age'] = 22;# 通过GLOBALS可以添加一个全局变量,且在函数体外部可以使用 unset($GLOBALS['a']); # 通过GLOBALS删除全局变量,会影响到全局变量 $GLOBALS['a'] = 500; # 通过GLOBALS直接申明并赋值不会报错,是正确的使用 } get(); echo $age; # 结果为22,GLOBAL可以添加一个全局变量 echo $a; # 结果为500,因为我虽然删除了开始的a但是又声明定义了一个全新的a全局变量 ``` ## global与$GLOBALS的区别 * [ ] global unset变量不会影响全局的变量,而$GLOBALS会影响 * [ ] global 必须先申明再赋值,而$GLOBALS可以直接申明并赋值 >[danger] 以上就是换个写法都可以做到相同,下面是我百度结果,但是我还是没太看明白 > 很多人都认为global和$GLOBALS\[\]只是写法上面的差别,其实不然(我就是这其中的一员),具体的区分我也不太懂,在我的理解里面他们除了写法上的差别就没啥区别了。但是这肯定错误的,不然网上不会那么人说区别很大。有好的理解欢迎您的留言。