PHP变量名严格区分大小写,$user与$User是两个独立变量;数组字符串键、对象属性名同样区分大小写,而函数名、类名不区分大小写。

PHP变量名区分大小写,但不是所有地方都“显性报错”
变量名本身严格区分大小写,$user 和 $User 是两个完全独立的变量,各自有独立作用域和生命周期。这点在函数内外、include文件之间都成立。容易忽略的是:它不触发任何警告或 Notice,只是静默创建/读取不同变量——比如你在 config.php 里写了 $DB_HOST,却在主逻辑里用了 $db_host,结果就是 $db_host 为 null,而你查半天没发现拼写问题。
- 变量名必须以字母或下划线开头,不能以数字或特殊符号(如
-、@)开头 -
$echo、$class、$null这类名字直接导致Parse error: syntax error, unexpected 'echo' (T_ECHO),不是运行时报错,是根本解析不过 -
$_POST、$GLOBALS等超全局变量名不可覆盖,赋值如$_POST = []会清空原始数据,不是“定义新变量”
数组键名也区分大小写,但只对字符串键生效
PHP 数组的键分两类:整数键(如 0、123)和字符串键(如 'id'、'ID')。只有字符串键遵循大小写敏感规则;整数键本质是数字,没有大小写概念。
-
$data = ['ID' => 123, 'id' => 456];→$data['ID']返回123,$data['id']返回456 -
$data['Id']或$data['iD']返回null,且不会触发Notice,容易误判为“键不存在”而非“大小写错了” - 从 JSON 解码来的数组(
json_decode($json, true))默认生成字符串键,同样区分大小写;别指望前端传userId,后端用userid能自动匹配
对象属性名也区分大小写,且和变量规则一致
对象属性本质上是类作用域内的变量名映射,所以 $obj->name 和 $obj->Name 是两个不同属性,哪怕你只给其中一个赋了值。
- 使用
stdClass动态添加属性时,大小写错误一样静默失败:$obj->Email = 'a@b.c';后读$obj->email得到null - Laravel 的
Illuminate\Support\Fluent或 Doctrine 的实体类,属性访问同样受此约束,IDE 自动补全可能误导你——它只按你当前写的大小写提示,不校验实际是否存在 - 用
get_object_vars($obj)获取属性列表时,键名保持原始大小写,不会统一转小写或驼峰
为什么这些区别容易被忽略
因为 PHP 不会在大小写不匹配时抛出明确错误,而是返回 null、undefined 或静默创建新变量。最麻烦的是:这种问题在开发环境可能因 error_reporting 设置过低而完全看不见,在测试环境又因数据构造巧合“刚好跑通”,上线后才暴露。
立即学习“PHP免费学习笔记(深入)”;
- 数组键大小写问题多发于 API 请求字段映射、数据库列名转换(如
user_idvsUserID) - 变量名大小写问题高发于跨文件 include、模板引擎变量传递、以及从旧代码迁移时命名风格不统一
- 对象属性问题集中在动态属性访问、反射操作(
ReflectionProperty)、和序列化/反序列化场景



















