变量作用域 #

一、作用域概述 #

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();
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