PHP 变量

变量是程序的"盒子",用来存放数据。PHP 变量有几个鲜明特征:以 $ 开头弱类型(无需声明类型)、有作用域。这一章把这些全部讲清楚。

1. 变量的基本用法

PHP 变量无需提前声明,第一次赋值时自动创建。用 = 赋值(注意:这是赋值,不是"等于")。

<?php
// 变量以 $ 开头,后面跟变量名
$name = "小明";
$age = 25;
$price = 99.5;
$isVip = true;

// 重新赋值(类型可变,弱类型)
$age = "二十六";          // 现在是字符串
echo $age;                // 二十六

// 一次给多个变量赋值
$a = $b = $c = 0;         // 三个变量都是 0

// 变量交换(需临时变量)
$temp = $a; $a = $b; $b = $temp;

PHP 是弱类型语言:同一个变量可以先存数字,再存字符串,类型在运行时自动转换。这在快速开发时很灵活,但也容易埋下 bug,大型项目建议用 PHP 7+ 的严格类型模式(第 13 章会讲)。

2. 变量命名规则

<?php
// ✅ 合法命名
$name = "OK";
$age2 = 20;               // 数字可放在非首位
$_email = "a@b.com";      // 下划线开头
$firstName = "小明";      // 驼峰
$user_name = "xiaoming";  // 蛇形

// ❌ 非法命名
// $2name = "x";     // 不能以数字开头
// $first-name = "x"; // 不能有连字符(会被解释成减号)
// $first name = "x"; // 不能有空格

// 可变变量(variable variable,少用)
$prop = "name";
$$prop = "小明";          // 等价于 $name = "小明"
echo $name;               // 小明

命名风格建议:小写驼峰($firstName)或蛇形($first_name),团队内统一即可。可变变量($$prop)能不用就不用,可读性差。

3. 变量作用域

作用域决定"变量在哪里能被访问"。PHP 有 4 种作用域:局部、全局、静态、超级全局。这是新手最容易踩坑的地方。

3.1 局部变量 vs 全局变量

PHP 默认函数内访问不到函数外的变量,反之亦然——这叫"函数作用域"。要在函数内用全局变量,必须用 global 关键字声明:

<?php
$global = "我是全局变量";

function test() {
    // 在函数内部访问不到外面的 $global
    // echo $global;  // 报错:未定义

    // 用 global 关键字声明后才能访问
    global $global;
    echo $global;          // 我是全局变量

    // 局部变量:仅在函数内有效
    $local = "函数内有效";
    echo $local;
}

test();
// echo $local;  // 报错:函数外访问不到局部变量

3.2 静态变量:跨调用保持值

普通局部变量每次函数调用都会重置。static 变量则不同——它只初始化一次,后续调用保留上次的值:

<?php
function counter() {
    static $count = 0;     // 只在第一次调用时初始化
    $count++;
    echo "第 {$count} 次调用\n";
}

counter();   // 第 1 次调用
counter();   // 第 2 次调用
counter();   // 第 3 次调用
// static 变量在多次调用之间保持值,但仍是函数私有

static 适合做计数器、单例模式等。注意它不是全局变量,外部仍然访问不到。

4. 超级全局变量

PHP 内置了 9 个超级全局变量(superglobals),它们在任何作用域(函数内、类内、全局)都能直接访问,无需 global 声明。这是 PHP 为 Web 开发专门设计的便利:

<?php
// 超级全局变量:在任何作用域都能访问
echo $_SERVER["HTTP_HOST"];     // 当前主机名
echo $_SERVER["REMOTE_ADDR"];   // 客户端 IP
echo $_SERVER["REQUEST_METHOD"]; // GET 或 POST

// 常用超级全局变量:
// $_GET     - URL 查询参数
// $_POST    - 表单 POST 数据
// $_COOKIE  - Cookie
// $_SESSION - 会话
// $_FILES   - 上传文件
// $_SERVER  - 服务器和请求信息
// $_ENV     - 环境变量
// $_REQUEST - $_GET + $_POST + $_COOKIE 合集

这些超级全局变量在后续章节会逐个用到:$_GET / $_POST 在第 11 章表单,$_SESSION 在第 12 章会话,$_FILES 在第 15 章文件上传。

5. 常量

常量是一旦定义就不能修改的标识符,用于存放配置值、版本号、上限等不会变的数据。PHP 有两种定义方式:

<?php
// 用 define() 定义常量(运行时,可用表达式)
define("MAX_USERS", 1000);
define("APP_NAME", "我的应用");

// 用 const 关键字定义(编译时,更快)
const VERSION = "1.0.0";
const PI = 3.14159;

// 常量不加 $,全大写是惯例
echo MAX_USERS;          // 1000
echo APP_NAME;           // 我的应用

// 常量一旦定义不能修改、不能取消
// MAX_USERS = 2000;  // 错误!

// 检查常量是否已定义
if (defined("MAX_USERS")) {
    echo "已定义";
}

// 魔术常量(值随位置变化)
echo __LINE__;           // 当前行号
echo __FILE__;           // 当前文件完整路径
echo __DIR__;            // 当前文件所在目录
echo __FUNCTION__;       // 当前函数名

几个对比:

6. 检查变量状态

小结

这一章你掌握了 PHP 变量的全部基础:$ 开头的命名规则、弱类型赋值、四种作用域、超级全局变量、define/const 常量。下一篇我们看 PHP 有哪些数据类型,以及它们之间的转换规则。

← 上一篇 PHP 基础语法

下一篇 PHP 数据类型

✈️💬