变量作用域 #
一、作用域概述 #
PHP变量有四种作用域:
| 作用域 | 说明 |
|---|---|
| 局部变量 | 函数内部定义的变量 |
| 全局变量 | 函数外部定义的变量 |
| 静态变量 | 函数内部使用static声明 |
| 超全局变量 | PHP预定义,全局可用 |
二、局部变量 #
2.1 基本概念 #
函数内部定义的变量,只在函数内有效:
php
<?php
function test(): void
{
$local = "局部变量";
echo $local;
}
test();
2.2 函数结束后销毁 #
php
<?php
function counter(): int
{
$count = 0;
$count++;
return $count;
}
echo counter();
echo counter();
echo counter();
2.3 参数也是局部变量 #
php
<?php
function greet(string $name): void
{
echo "Hello, $name\n";
}
greet("John");
2.4 嵌套函数的作用域 #
php
<?php
function outer(): void
{
$outerVar = "outer";
function inner(): void
{
echo $outerVar;
}
inner();
}
outer();
三、全局变量 #
3.1 基本概念 #
函数外部定义的变量,默认在函数内不可访问:
php
<?php
$global = "全局变量";
function test(): void
{
echo $global;
}
test();
3.2 使用global关键字 #
php
<?php
$global = "全局变量";
function test(): void
{
global $global;
echo $global;
}
test();
3.3 修改全局变量 #
php
<?php
$counter = 0;
function increment(): void
{
global $counter;
$counter++;
}
increment();
increment();
increment();
echo $counter;
3.4 使用$GLOBALS数组 #
php
<?php
$global = "全局变量";
function test(): string
{
return $GLOBALS['global'];
}
echo test();
3.5 global vs $GLOBALS #
php
<?php
$var = 1;
function test1(): void
{
global $var;
$var = 2;
}
function test2(): void
{
$GLOBALS['var'] = 3;
}
test1();
echo $var;
test2();
echo $var;
四、静态变量 #
4.1 基本概念 #
使用static声明,值在函数调用间保持:
php
<?php
function counter(): int
{
static $count = 0;
$count++;
return $count;
}
echo counter();
echo counter();
echo counter();
4.2 只初始化一次 #
php
<?php
function test(): void
{
static $count = 0;
$count++;
echo "Count: $count\n";
static $count = 10;
}
4.3 实际应用 #
php
<?php
function generateId(): int
{
static $id = 0;
return ++$id;
}
echo generateId();
echo generateId();
echo generateId();
4.4 递归计数 #
php
<?php
function factorial(int $n): int
{
static $calls = 0;
$calls++;
echo "Calls: $calls\n";
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo factorial(5);
4.5 静态数组 #
php
<?php
function cache(string $key, mixed $value = null): mixed
{
static $cache = [];
if ($value !== null) {
$cache[$key] = $value;
}
return $cache[$key] ?? null;
}
cache('name', 'John');
echo cache('name');
五、超全局变量 #
5.1 列表 #
| 变量 | 说明 |
|---|---|
| $GLOBALS | 全局变量数组 |
| $_SERVER | 服务器信息 |
| $_GET | GET请求参数 |
| $_POST | POST请求参数 |
| $_REQUEST | GET + POST + COOKIE |
| $_SESSION | 会话变量 |
| $_COOKIE | Cookie变量 |
| $_FILES | 上传文件信息 |
| $_ENV | 环境变量 |
5.2 $GLOBALS #
php
<?php
$name = "John";
$age = 25;
function showUser(): void
{
foreach ($GLOBALS as $key => $value) {
if ($key !== 'GLOBALS') {
echo "$key: $value\n";
}
}
}
showUser();
5.3 $_SERVER #
php
<?php
echo $_SERVER['PHP_SELF'];
echo $_SERVER['SERVER_NAME'];
echo $_SERVER['HTTP_HOST'];
echo $_SERVER['REQUEST_METHOD'];
echo $_SERVER['REQUEST_URI'];
echo $_SERVER['HTTP_USER_AGENT'];
5.4 $_GET #
php
<?php
$id = $_GET['id'] ?? 0;
$name = $_GET['name'] ?? 'Guest';
echo "ID: $id, Name: $name";
5.5 $_POST #
php
<?php
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
5.6 $_SESSION #
php
<?php
session_start();
$_SESSION['user_id'] = 1;
$_SESSION['username'] = 'John';
echo $_SESSION['username'];
unset($_SESSION['user_id']);
session_destroy();
5.7 $_COOKIE #
php
<?php
setcookie('theme', 'dark', time() + 86400, '/');
echo $_COOKIE['theme'] ?? 'light';
六、作用域示例 #
6.1 变量覆盖 #
php
<?php
$name = "Global";
function test(): void
{
$name = "Local";
echo "Inside: $name\n";
}
test();
echo "Outside: $name\n";
6.2 include的作用域 #
php
<?php
$var = "main";
function loadFile(): void
{
global $var;
include 'included.php';
}
6.3 闭包的作用域 #
php
<?php
$message = "Hello";
$greet = function() use ($message) {
echo $message;
};
$greet();
6.4 箭头函数的作用域 #
php
<?php
$message = "Hello";
$greet = fn() => $message;
echo $greet();
七、变量生命周期 #
7.1 局部变量 #
php
<?php
function test(): void
{
$var = "created";
echo $var;
}
test();
7.2 静态变量 #
php
<?php
function test(): int
{
static $count = 0;
return ++$count;
}
7.3 全局变量 #
php
<?php
$global = "exists until script ends";
function cleanup(): void
{
global $global;
unset($GLOBALS['global']);
}
八、实际应用 #
8.1 单例模式 #
php
<?php
class Database
{
private static ?Database $instance = null;
private function __construct() {}
public static function getInstance(): Database
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
$db = Database::getInstance();
8.2 配置管理 #
php
<?php
function config(string $key, mixed $default = null): mixed
{
static $config = null;
if ($config === null) {
$config = require 'config.php';
}
return $config[$key] ?? $default;
}
echo config('database.host', 'localhost');
8.3 缓存函数 #
php
<?php
function remember(string $key, callable $callback, int $ttl = 3600): mixed
{
static $cache = [];
if (isset($cache[$key])) {
return $cache[$key];
}
return $cache[$key] = $callback();
}
$user = remember('user_1', fn() => fetchUser(1));
8.4 请求处理 #
php
<?php
function request(): array
{
return [
'method' => $_SERVER['REQUEST_METHOD'],
'path' => $_SERVER['REQUEST_URI'],
'query' => $_GET,
'body' => $_POST,
'cookies' => $_COOKIE,
];
}
$req = request();
echo $req['method'];
九、最佳实践 #
9.1 避免全局变量 #
php
<?php
$counter = 0;
function increment(): void
{
global $counter;
$counter++;
}
class Counter
{
private int $count = 0;
public function increment(): int
{
return ++$this->count;
}
}
9.2 使用依赖注入 #
php
<?php
class UserService
{
public function __construct(
private UserRepository $repository
) {}
public function find(int $id): ?User
{
return $this->repository->find($id);
}
}
9.3 使用静态变量实现缓存 #
php
<?php
function getSettings(): array
{
static $settings = null;
if ($settings === null) {
$settings = parse_ini_file('settings.ini');
}
return $settings;
}
9.4 验证超全局变量 #
php
<?php
function getInput(string $key, mixed $default = null): mixed
{
return $_GET[$key] ?? $_POST[$key] ?? $default;
}
function getValidatedInput(array $rules): array
{
$input = [];
foreach ($rules as $field => $rule) {
$value = getInput($field);
$input[$field] = $rule($value);
}
return $input;
}
十、总结 #
本章学习了:
- 局部变量
- 全局变量
- 静态变量
- 超全局变量
- 变量生命周期
- 最佳实践
下一章将学习匿名函数。
最后更新:2026-03-26