php变量名必须以字母或下划线开头,后续字符仅限字母、数字、下划线,区分大小写,不可用保留字,超全局变量名虽不区分大小写但需大写才有效。

PHP变量名只能以字母或下划线开头
PHP解析器在词法分析阶段就严格限制了变量名的起始字符——$后面第一个字符必须是 ASCII 字母(a–z、A–Z)或下划线 _,其他任何符号(包括数字、中文、$、@、-、空格等)都会直接报错或被截断。
常见错误现象:Parse error: syntax error, unexpected '$123' (T_VARIABLE) 或 Parse error: syntax error, unexpected '$user-name';这类报错不是运行时问题,而是 PHP 无法完成语法解析。
-
$123abc:非法,开头是数字 -
$user-name:非法,连字符不是合法标识符字符 -
$用户:非法,UTF-8 中文字符不被接受为变量首字符(即使启用了 mbstring 扩展也不行) -
$_config和$userName:合法,符合规则
PHP变量名中间和结尾只能用字母、数字、下划线
变量名中除首字符外,后续字符只允许是 ASCII 字母、阿拉伯数字(0–9)或下划线 _。这是由 PHP 的词法规则(Zend 引擎的 lex_scan 实现)硬编码决定的,不支持 Unicode 字母(比如希腊字母 α)、emoji、全角字符或任何控制字符。
使用场景里容易误判的是“看起来像变量”的字符串拼接或动态构造,比如 ${'user@domain'} 这种写法看似能绕过限制,但它属于“可变变量”语法,实际访问的是名为 user@domain 的变量——而该变量本身仍需遵守命名规则才能被正常声明;否则就是未定义变量,不会报错但读不到值。
立即学习“PHP免费学习笔记(深入)”;
-
$user_name123:合法 -
$user.name:非法,点号不是标识符字符,会被当作对象属性访问操作符 -
$user@domain:非法,@ 不是合法字符,PHP 解析器会在此处中断并报错 -
${'user_name'}:合法,但只是动态引用已存在的变量,不改变命名规则本身
PHP变量名区分大小写,但超全局变量名不区分
普通变量名严格区分大小写,$Name、$name、$NAME 是三个完全不同的变量;但超全局变量如 $_GET、$_POST 在语法层面强制大写,写成 $_get 或 $_Get 虽然不会报错(PHP 会自动转为大写形式),但会导致逻辑失效——因为数据实际存在 $_GET 里,你读的是个空数组。
性能影响极小,但兼容性隐患明显:某些旧版 PHP(如 5.4 以前)对超全局变量名大小写的容忍度更低,部分 SAPI(如 CGI 模式)甚至直接拒绝执行。
-
$MyVar = 1; echo $myvar;:输出空,不报错但取不到值 -
$_get['id']:语法上不报错,但返回null,因为实际数据在$_GET -
function foo($A) { return $a; }:函数参数名也区分大小写,$A和$a不同
别用保留字当变量名,哪怕加了下划线也没用
PHP 有约 100 个保留关键字(如 class、function、echo、public),它们在语法层被锁定,不能用作变量名。加前缀或后缀(比如 $class_name 合法,但 $class 非法)可以,但单用保留字本身,哪怕加上下划线($_class 合法,$class 依然非法),都不行——这不是风格问题,是语法解析器直接拒绝识别。
容易踩的坑是 IDE 自动补全或从其他语言迁移过来的习惯:比如 JavaScript 允许 let class = 'A',但 PHP 一写就崩;又或者复制粘贴时没注意变量名是否撞上了 list、yield、clone 这类较新的关键字。
-
$class = 'User';:致命错误:Parse error: syntax error, unexpected 'class' (T_CLASS) -
$Class = 'User';:仍然非法,保留字不区分大小写 -
$my_class = 'User';:合法,加了前缀就脱离关键字范围 - 检查方法:查官方文档的
reserved keywords列表,别靠记忆
真正麻烦的不是记不住规则,而是错误发生在变量声明那一行之外——比如模板里拼接出一个非法变量名,或者从配置文件动态注入变量名时没过滤。这时候报错位置和问题根源经常错位,得倒着查。











