PHP 变量与作用域详解:局部、全局、global 关键字与 Static 用法

· PHP笔记 小技巧 PHP 入门笔记 · 0 阅读 · 约 4 分钟

前言

变量是 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 变量可以在多次函数调用间保留值
  • 函数参数属于局部作用域

理解了作用域,函数传值、引用传递这些进阶话题就都好理解了。