前言
变量是 PHP 最基础的知识点,但很多初学者在函数内外传值时经常踩坑,根源就在于没有搞清楚作用域。这篇笔记把 PHP 变量作用域相关的几个要点整理一下。
PHP 变量基础
PHP 变量以 $ 符号开头,变量名区分大小写,不需要提前声明类型:
<?php
$txt = "Hello World";
$number = 100;
$x = 5;
$y = 10;
echo $x + $y; // 输出 15
?>
局部作用域和全局作用域
变量定义的位置不同,作用范围也不同:
- 全局作用域:在函数外部定义的变量,只能在函数外部访问
- 局部作用域:在函数内部定义的变量,只能在函数内部访问
<?php
$x = 5; // 全局变量
function myTest() {
echo $x; // 错误:无法访问全局变量
}
myTest();
function myTest2() {
$y = 10; // 局部变量
echo $y;
}
myTest2();
// echo $y; // 错误:函数外无法访问局部变量
?>
global 关键字
如果想在函数内部访问全局变量,需要在函数内使用 global 关键字声明:
<?php
$x = 5;
$y = 10;
function myTest() {
global $x, $y;
$x = $x + $y;
}
myTest();
echo $x; // 输出 15
?>
PHP 将所有全局变量存储在一个名为 $GLOBALS 的超级全局数组中,上面的写法等价于:
<?php
$x = 5;
$y = 10;
function myTest() {
$GLOBALS['x'] = $GLOBALS['x'] + $GLOBALS['y'];
}
myTest();
echo $x; // 输出 15
?>
Static 作用域
函数内部的局部变量在函数执行完毕后就会被销毁。如果希望某个局部变量在多次调用之间保留值,可以用 static 关键字:
<?php
function myTest() {
static $count = 0;
$count++;
echo "第 $count 次调用<br>";
}
myTest(); // 第 1 次调用
myTest(); // 第 2 次调用
myTest(); // 第 3 次调用
?>
注意:static $count = 0 的初始化只在第一次调用时生效,后续调用会跳过赋值语句继续累加。另外该变量仍然只能在函数内部访问。
参数作用域
函数参数也属于局部作用域,只在函数内部有效:
<?php
function myTest($name) {
echo "Hello, $name";
}
myTest("PHP"); // Hello, PHP
// echo $name; // 错误:参数在函数外不可见
?>
小结
- 函数外定义的是全局变量,函数内默认无法直接访问
- 函数内定义的是局部变量,函数外无法访问
- 函数内要访问全局变量,用
global关键字或$GLOBALS数组 static变量可以在多次函数调用间保留值- 函数参数属于局部作用域
理解了作用域,函数传值、引用传递这些进阶话题就都好理解了。