变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。变量依据声明的位置分为局部变量和全局变量两种。
一、局部变量
(1)局部变量也叫内部变量,是在函数内部声明的变量。
起作用仅限于函数内部,离开该函数的时候再使用这种变量是非法的。当每次调用函数的时候,函数内部的变量才被声明,执行完毕后,函数内部的变量都将被释放。
function add1($a){
$b = 100;//函数内声明一个变量
echo "internal var execute :$a + $b",'=',($a+$b),'<br/>';//局部变量求和
}
add1(100);//向add函数传入100进行计算 函数内部可以访问局部变量,输出结果200
echo "overall var execute :$a + $b",'=',($a+$b),'<br/>';//函数外部不能访问函数内部的局部变量,报错
上面的例子中声明一个add()函数,只有调用函数时候,才会去声明两个变量$a和$b。这两个变量都是局部变量,只能用于函数内部使用。当add()输出结果执行完毕后,这两个变量都会释放,在函数外是访问不到的。
(二)如果想在函数外部调用该变量值,必须通过return语句返回其值。
function add2($a){#声明一个函数,传入一个参数$a
$b = 100;#函数内部声明一个局部变量$b
return $a+$b;#使用算术运算符计算结果返回到函数调用处
}
$sum = add2(100);#将函数的返回值赋给$sum
echo $sum;//200 输出函数返回值
二、全局变量
(1)全局变量也叫做外部变量,是在函数外部定义的。
作用域从变量开始处到程序结束处。和其他语言不同,全局变量不可以在函数内部直接调用,函数可以视为单独的程序片段。c语言中全局变量在函数中自动生效,除非被局部变量覆盖。
$one = 100;
$two = 200;
function add3(){
echo $one+$two;#相当于直接在函数内部声明两个局部变量并且没有赋值。
}
add3();//报错notice,意味$one和$two没有定义,输出0
echo $one+$two;//输出300
(2)PHP中全局变量在函数中使用需要声明global。
$one = 100;
$two = 200;
function add4(){
global $one,$two;//在函数内部使用global关键字加载全局变量
echo $one+$two;
}
add4();//输出300
echo $one+$two;//输出300
(3)在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组 。
$one = 100;
$two = 200;
function add5(){
$GLOBALS['one'] = $GLOBALS['one'] + $GLOBALS['two'];#超全局数组访问全局变量
}
add5();//执行后改变了全局$one的值
echo $one;//输出300 说明全局变量访问到了,被重新赋值
三、静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
局部变量从存储方式上可以有动态存储类型和静态存储类型。函数中的局部变量,如果不专门声明static存储,那么默认都是动态分配内存空间,其变量会在函数调用后自动释放。如果希望函数在执行完毕后,变量依然保存在内存中应使用static关键字声明静态变量。
声明静态变量后,是在所有对该函数的调用之间共享。即函数再次执行时候,静态变量将持续前次的结果继续运算,并且仅仅在脚本的执行期间,函数第一次调用时候被初始化。
function demo(){
static $a = 0;
echo $a;
$a++;
}
demo();//0
demo();//1