0Pricing
PHP Academy · 课时

变量作用域:局部与全局

了解 PHP 如何隔离函数作用域,以及如何使用 global 关键字。

变量作用域:局部与全局 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。

PHP 中的变量作用域

在 PHP 中,每个变量都有一个作用域,也就是它可以访问的代码区域。

  • 在函数外创建的变量位于全局作用域
  • 在函数内创建的变量位于局部作用域
  • PHP NOT 具有块级作用域(不同于 C 或 JavaScript)

局部作用域

函数内的变量属于局部变量,函数返回时它们就会消失:

<?php
function compute(): void {
    $result = 42;  // local variable
    echo $result;  // 42
}

compute();
echo $result ?? 'undefined';  // undefined — $result is gone

全局变量不会自动可见

与许多语言不同,PHP 函数默认无法访问全局变量,您必须显式导入它们:

<?php
$message = 'Hello';

function printMessage(): void {
    echo $message ?? 'not visible';  // 'not visible'
    // $message from global scope is not accessible here
}

global 关键字

在函数内使用 global $varName,即可访问全局变量:

<?php
$counter = 0;

function increment(): void {
    global $counter;
    $counter++;
}

increment();
increment();
echo $counter;  // 2

$GLOBALS 超全局变量

$GLOBALS 是一个包含所有全局变量的数组,可以在任何位置访问,而无需使用 global 关键字:

<?php
$total = 100;

function addTax(): void {
    $GLOBALS['total'] *= 1.18;  // 18% tax
}

addTax();
echo $total;  // 118

为什么应避免使用 global

过度使用 global 会产生隐藏的依赖关系,使函数难以测试和调试。请优先将值作为参数传递:

<?php
// Bad
$db = new PDO(/* ... */);
function getUsers(): array {
    global $db;
    return $db->query('SELECT * FROM users')->fetchAll();
}

// Good
function getUsers(PDO $db): array {
    return $db->query('SELECT * FROM users')->fetchAll();
}

静态变量

static 变量会在多次函数调用之间保留其值,但它仍然属于该函数的局部变量:

<?php
function callCount(): int {
    static $count = 0;
    return ++$count;
}

echo callCount();  // 1
echo callCount();  // 2
echo callCount();  // 3

闭包与变量捕获

闭包(匿名函数)可以通过 use 捕获外部变量:

<?php
$prefix = 'Mr';

$greet = function(string $name) use ($prefix): string {
    return "$prefix. $name";
};

echo $greet('Smith');  // Mr. Smith

按引用捕获

使用 use (&$var) 按引用捕获变量,这样闭包就可以修改外部变量:

<?php
$total = 0;

$add = function(int $n) use (&$total): void {
    $total += $n;
};

$add(10);
$add(5);
echo $total;  // 15

箭头函数

PHP 7.4 的箭头函数(fn =>)会自动按值捕获外部作用域中的变量,无需使用 use:

<?php
$multiplier = 3;
$nums = [1, 2, 3, 4];

$result = array_map(fn($n) => $n * $multiplier, $nums);

print_r($result);  // [3, 6, 9, 12]

嵌套函数

PHP 允许在一个函数内定义另一个函数,但外层函数调用后,内层函数会变为全局可访问:

<?php
function outer(): void {
    function inner(): void {
        echo 'inner called';
    }
}

// inner(); // Fatal: undefined before outer() is called
outer();
inner(); // works now

快速检查

PHP 函数内的 static 变量有什么作用?

回顾:变量作用域

PHP 中作用域的主要规则:

  • 函数拥有各自的局部作用域
  • 全局变量必须使用 global 导入
  • 可以使用 $GLOBALS['name'] 作为替代方式
  • static 变量会在函数内部的多次调用之间持续存在
  • 闭包通过 use 捕获外部变量
  • 箭头函数会自动按值捕获变量

常见问题解答

「变量作用域:局部与全局」课时是免费的吗?

是的 — 「变量作用域:局部与全局」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。

「变量作用域:局部与全局」这节课中我会学到什么?

了解 PHP 如何隔离函数作用域,以及如何使用 global 关键字。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 PHP Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「变量作用域:局部与全局」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 PHP Academy 课中编写并运行代码吗?

能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义与调用函数
  2. 默认参数与可变参数
  3. 变量作用域:局部与全局
  4. 匿名函数与闭包
← 返回 PHP Academy