前言
变量的作用范围也就是他的生效范围。大部分的PHP变量只有一个单独的使用范围,也包含了include和require引入的文件。当一个变量执行赋值的动作后,会随着声明区域的位置差异而有不同的使用范围。大致上说,变量会依据声明的位置分为局部变量和全局变量两种。
局部变量
局部变量也称为内部变量,是在函数内部声明的变量,其作用域仅限于函数内部,离开这个函数后再使用这种变量是非法的。不仅在函数中声明的变量是局部变量,为声明函数设置的参数因为只能在本函数内部使用,所以也是局部变量。区别在于函数的参数具体数值从函数外部获得(函数被调用时传入的值),而直接在函数中声明的变量只能在函数内部被赋值。但他们的作用域都仅限于函数内部,因为当每次函数被调用时,函数内部的变量被声明,执行完毕后函数内部的变量都被释放。如下代码所示:
<?php
function test($one){
$two = 100;
echo "函数内部执行:$one+$two=".($one+$two)."\n";
}
test(300);
echo "在函数外部执行:$one+$two=".($one+$two)."\n";
执行结果如下:
在上面的例子中,声明了一个test()函数,当调用test()时才会声明两个变量$one和$two,这两个变量都是局部变量。变量$one是在参数中声明的并在调用时被赋值300,另一个变量$two是在函数中声明的并直接赋值100,这两个局部变量只能在函数的内部使用,输出计算结果。当test()函数执行结束时,这两个变量就会被释放。因此在函数外部访问这两个变量时时不存在的,所以没有输出结果。如果在函数外部需要调用该变量值,必须通过return指令将其值传回至主程序区块以做后续处理。如下所示:
<?php
function test($one){
$two = 100;
return $one+$two;
}
$sum = test(300);
echo "在函数外部执行:$ one + $ two= ".$sum."\n";
执行结果如下:
全局变量
全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。和其他编程语言不同,全局变量不是自动设置为可用的。在PHP中,由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,我平时会把它称为就近原则。因此在函数中无法直接调用全局变量。
<?php
$one = 200;
$two = 100;
function test(){
echo "函数内部执行结果:$ one+$ two=".($one+$two)."\n";
}
test();
执行结果:
在上面的例子中,函数test()外面声明了两个全局变量$one和$two,但在PHP中,不能直接在函数中使用全局变量。所以在test()函数中使用的变量$one和$two,相当于新声明的两个变量,并没有被赋初值,是两个空值运算,所以得到的结果为0.在函数中若使用其全局变量,必须要利用global关键字定义目标变量,以告诉函数主体此变量为全局变量。如下面代码所示:
<?php
$one = 200;
$two = 100;
function test(){
global $one,$two;
echo "函数内部执行结果:$ one+$ two=".($one+$two)."\n";
}
test();
执行结果如下:
在函数中使用全局变量,除了使用关键字global,还可以使用特殊的PHP自定义GLOBALS数组。前面的例子的写成使用$GLOBALS替代global。如下面代码所示:
<?php
$one = 200;
$two = 500;
function test(){
$GLOBALS['two'] = $GLOBALS['one'] + $GLOBALS['two'];
}
test();
echo "计算结果:".$two;
执行结果如下:
在$GLOBALS数组中,每一个变量是一个元素,键名对应变量名,值对应变量的内容$GLOBALS之所以在全局范围内存在,是因为它是一个超全局变量。关于超全局变量后面我们单独详细介绍。
静态变量
局部变量从存储方式上可分为动态存储类型和静态存储类型,函数中的局部变量,如不专门声明为static存储类型,默认都是动态第分配存储空间的,其中的内部动态变量在函数调用结束后自动释放,如果希望在函数执行完毕后,静态本来并不会消失,而是在所有对该函数的调用之间共享,即在函数再次执行时静态变量将接续前次的结果继续运算,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的,需用关键字static修饰,static用法如下:
1.static 放在函数内部修饰变量
2.static放在类里修饰属性,或方法
3.static放在类的方法里修饰变量
4.static修饰在全局作用域的变量
和局部变量相比,静态变量具有一下特点:
- 当函数执行完毕后,静态变量不会消失
- 静态变量只能在函数内部使用
- 静态变量只会被初始化一次
- 静态变量初始化的值可以省略,默认值为 null
- 静态变量的初始值只能是具体的字符串、数值等,而不能是一个表达式
注意:在函数外面使用静态变量时并不会报错,这时它的生命周期与作用域和全局变量是一样的;在函数内部定义静态变量时,它的生命周期也和全局变量一样,但是作用域和局部变量的作用域一样的。
静态变量并不是说它的值是不能改变的,不能改变值的那叫常量。 其实静态变量的值是可以改变的,而且它会保持最新的值。之所以称为静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,那么下次函数调用时,这个值是保持不变的
还有一点需要注意的是:静态变量虽然在程序的整个执行过程中始终存在,但是它的作用域和局部变量是一样的,在作用域之外是不能使用的。
如下面代码所示:
<?php
function test(){
static $one = 0;
echo $one."\n";
$one++;
}
test();
test();
test();
test();
执行结果如下:
在上面的例子中,将函数test()中的局部变量$one使用static关键字声明为静态变量,并赋初始值0。函数在第一次执行时,静态变量$one经过运算后从初值0变为1。当函数第一次执行完毕后,静态变量$one并没有被释放,而是将结果保存在静态内存中。第二次执行时,$one从内存中获取上一次计算的结果1,继续运算,并将结果2存于静态内存空间中。以后每次函数执行时,静态变量将从自己的内存空间中获取前次的存储结果,并以此作为初值进行计算。也就是说静态变量只在内存空间中开辟一片空间,不管调用多少次都是共享这个内存空间存储的变量。