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. 变量命名规则
- 以 $ 开头,后面跟着变量名。
- 变量名由字母、数字、下划线组成,不能以数字开头。
- 区分大小写(
$name和$Name是两个不同变量)。 - 不能用 PHP 关键字作为变量名(如
$if、$for)。
<?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__; // 当前函数名几个对比:
- define() vs const:
define在运行时定义,可用条件和表达式;const在编译时定义,更快但必须是常量表达式。类内必须用 const。 - 常量不加 $,且默认全局(没有作用域限制)。
- 常量不能被重新赋值或取消,这是它与变量最大的区别。
- 惯例:全大写 + 下划线(
MAX_USERS),方便一眼区分。
6. 检查变量状态
isset($var)— 变量已声明且不为 null。empty($var)— 变量为空(0、""、"0"、null、false、空数组都算空)。unset($var)— 销毁变量,释放内存。defined("NAME")— 常量是否已定义。
小结
这一章你掌握了 PHP 变量的全部基础:$ 开头的命名规则、弱类型赋值、四种作用域、超级全局变量、define/const 常量。下一篇我们看 PHP 有哪些数据类型,以及它们之间的转换规则。
← 上一篇 PHP 基础语法
下一篇 PHP 数据类型 →