变量作用域:局部与全局
了解 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 反馈 — 无需本地设置。