变量只能在定义它的区域内访问,这称为变量的范围。在PHP中,变量作用域主要分为三种:
- 局部变量
- 全局变量
- 静态变量
局部变量
如果变量是在函数内部创建的,则称为局部变量并且具有局部作用域。局部变量只能在该函数内部使用。
示例
在下面的示例中,在函数MyPrint() 内部创建了一个局部变量 MyStr ,只能在该函数内部访问。
<?php
$MyStr = "Hello World!";
function MyPrint() {
$MyStr = "Hello PHP";
echo "$MyStr \n";
}
MyPrint();
echo "$MyStr \n";
?>
上述代码的输出将是:
Hello PHP
Hello World!
全局变量
全局变量可以在函数内部和函数外部的任何地方使用。如果变量是在函数外部创建的,则它将是全局变量并且具有全局作用域。
要在函数内访问或创建全局变量,必须在函数中将其显式声明为全局变量。这可以通过将关键字 GLOBAL(或 global)放在变量前面来实现。
示例
在下面的示例中,创建了三个全局变量并以不同的方式使用。
<?php
//使用GLOBAL关键字创建的全局变量
GLOBAL $var1;
$var1 = 100;
//全局变量 - 在任何函数外部创建
$var2 = 200;
function MyPrint() {
//在函数内使用全局变量
//必须显式声明为全局
//否则将被视为局部变量
GLOBAL $var1, $var2;
//在函数内创建新的全局变量
GLOBAL $var3;
$var3 = 300;
//对全局变量所做的任何更改都会
//在函数外也改变它的值
$var1 += 5;
echo "\$var1 = $var1 \n";
echo "\$var2 = $var2 \n";
echo "\$var3 = $var3 \n";
}
echo "函数内部: \n";
MyPrint();
echo "\n函数外部: \n";
echo "\$var1 = $var1 \n";
echo "\$var2 = $var2 \n";
echo "\$var3 = $var3 \n";
?>
上述代码的输出将是:
函数内部:
$var1 = 105
$var2 = 200
$var3 = 300
函数外部:
$var1 = 105
$var2 = 200
$var3 = 300
如果在函数内部创建同名变量(不使用 GLOBAL 关键字),它将是一个局部变量,并且只能在函数内部使用。对局部变量执行的任何操作都不会更改全局变量。
示例
考虑下面的示例:
<?php
//全局变量
$var = 100;
function MyPrint() {
//局部变量
$var = 200;
echo "$var \n";
}
MyPrint();
echo "$var \n";
?>
上述代码的输出将是:
200
100
使用 $GLOBALS 而不是GLOBAL关键字
从全局范围访问变量的第二种方法是使用特殊的 PHP 定义的 $GLOBALS 数组。 $GLOBALS 数组是一个关联数组,其中全局变量的名称为键,该变量的内容为数组元素的值。请注意,$GLOBALS 存在于任何作用域中,这是因为 $GLOBALS 是超全局变量。
示例
在下面的示例中,使用 $GLOBALS 在函数内部访问全局变量。
<?php
//创建全局变量
$var1 = 100;
$var2 = 200;
function MyPrint() {
//全局变量在函数内部访问
//使用$GLOBALS
$GLOBALS['var1'] = $GLOBALS['var1'] + 10;
$GLOBALS['var2'] = $GLOBALS['var2'] + 20;
}
MyPrint();
echo "\$var1 = $var1 \n";
echo "\$var2 = $var2 \n";
?>
上面代码的输出将是:
$var1 = 110
$var2 = 220
静态变量
静态变量只存在于局部函数作用域中,但不会丢失当程序执行离开函数作用域时它的值。
可以通过在变量名称前面放置关键字 STATIC(或 static)来创建静态变量。
示例
考虑下面的示例,其中创建了静态变量 count。它只能在函数 MyFunction() 内部访问,并在每次函数调用后保留其值。
<?php
function MyFunction() {
//创建静态变量
STATIC $count = 0;
$count++;
echo "$count \n";
}
MyFunction();
MyFunction();
MyFunction();
MyFunction();
MyFunction();
?>
上述代码的输出将是:
1
2
3
4
5