php变量名必须以$加字母或下划线开头,中间可含数字但不能纯数字,不支持unicode和保留字,大小写敏感,非法命名直接导致parse error。

PHP变量名必须以美元符和字母或下划线开头
PHP解析器在词法分析阶段就强制校验变量名格式,$123abc、$var-name、$中文 都会直接报 Parse error: syntax error, unexpected token。这不是运行时警告,是语法层面拒绝解析。
常见错误现象:
-
$user-id被当成$user加减号运算,报错Undefined variable $user -
$2nd_try直接中断脚本,连error_reporting(E_ALL)都救不了 -
$my var(含空格)被截断为$my,后续逻辑错乱但无提示
实操建议:
- 开头只能是
$+a-z、A-Z或_,比如$_config、$userId合法,$1user、$-flag不合法 - 中间和结尾可含数字,但不能纯数字,
$a1b2c3可以,$123不行 - 不区分大小写仅针对变量名本身(
$Name和$name是不同变量),但函数/类名在PHP中是大小写不敏感的——别混淆
Unicode字符在PHP变量名中基本不可用
PHP 7.0+ 虽然文档提了“支持Unicode标识符”,但实际只对扩展(如intl)开放,原生变量名仍严格限制在ASCII范围内。用 $用户 或 $αβγ 写进去,不是报错就是被当成乱码或截断。
立即学习“PHP免费学习笔记(深入)”;
使用场景:
- 国际化项目里想用本地语言命名?不行。得用拼音或英文,比如
$yonghuList而非$用户列表 - 从其他语言(如Python)迁移代码时,别照抄变量名,
$用户_数据必须改成$user_data
性能影响:无。因为根本解析不过去,压根不进执行阶段。
保留字不能用作变量名,哪怕加了$也不行
PHP把 class、function、echo、public 这些词锁死在语法层,$class 看似带了$,但解析器仍会报 Parse error: syntax error, unexpected 'class' (T_CLASS)。
容易踩的坑:
-
$echo、$print:看起来像变量,其实是语法冲突点 -
$int、$string:虽不是严格保留字,但在某些扩展或旧版本中可能引发歧义,建议避开 - IDE自动补全有时会推荐
$array,但它不是保留字;而$self是特殊变量(指向当前对象),不能随便覆盖
查是否可用最简单方法:
php -r 'var_dump(isset($class));'—— 如果报错,就说明这个词被语法占用了。
动态变量名(可变变量)有额外限制
像 $$name 这种写法,要求 $name 的值本身也得是合法变量名。如果 $name = "user-id",那 $$name 实际找的是 $user-id,而它根本不存在,也不会报错,只是返回 null 或触发 Notice: Undefined variable。
实操建议:
- 用
${'user_id'}替代$user-id类写法,花括号能明确界定变量边界 - 拼接生成变量名时,先过滤非法字符:
preg_replace('/[^a-zA-Z0-9_]/', '', $raw),再检查是否为空或纯数字 - 绝大多数情况下,该用数组就用数组,
$data['user-id']比${'user-id'}清晰安全得多
兼容性注意:PHP 8.2 开始对可变变量的类型推导更严格,某些隐式转换会触发 Deprecated 提示,别依赖它做核心逻辑。











