字符串键名必须加引号,否则php会解析为常量导致e_notice;foreach中修改数组需谨慎使用引用并unset;isset与empty对null等假值判断逻辑不同;数组展开需确保一维数值且位置匹配。

PHP中用变量当数组键名时,引号漏不漏很关键
直接说结论:字符串键名必须加引号,否则 PHP 会先尝试解析为常量,找不到就报 E_NOTICE,还可能意外触发 Undefined constant 错误。
比如 $arr[$key] 看似安全,但如果 $key 是未定义变量或拼写错误(如写成 $kay),PHP 会把它当常量名去查——而你根本没定义过这个常量。
- 正确写法:
$arr[$key]($key是变量)或$arr['name'](字面量字符串) - 危险写法:
$arr[name]—— 这里name没引号,PHP 就去找常量name,找不到就警告,且值转为字符串'name'继续执行,行为隐蔽 - 开
error_reporting(E_ALL)能立刻暴露这类问题;关了就容易埋雷
foreach 中修改原数组元素,& 引用不是万能解药
想在循环里改数组值,很多人第一反应是加 &,但实际要注意作用域和类型限制。
- 对索引数组有效:
foreach ($arr as &$v) { $v = strtoupper($v); } - 对关联数组也行,但别混用
key => value形式再加引用,比如foreach ($arr as $k => &$v)可以,但foreach ($arr as &$k => $v)语法错误 - 循环结束后记得
unset($v),否则后续代码中$v仍指向数组最后一项,可能引发意外覆盖 - 不能对表达式取引用,比如
foreach (getArray() as &$item)会报Cannot create references to elements of a temporary array expression
isset() 和 empty() 判数组键存在性,结果可能相反
这两个函数看着像兄弟,其实逻辑差异很大,尤其遇到 null、0、空字符串等“假值”时。
立即学习“PHP免费学习笔记(深入)”;
-
isset($arr['id'])返回false当键不存在,或键存在但值为null -
empty($arr['id'])返回true当键不存在、值为null、0、''、false、[] - 想确认“键存在且非 null”,用
array_key_exists('id', $arr)最准,它不关心值内容 - 想确认“键存在且值为真”,得组合判断:
isset($arr['id']) && $arr['id']
PHP 7.4+ 数组展开(...)和变量混合传参易错点
用 ... 展开数组传参时,如果中间夹着普通变量,顺序和类型必须严格匹配函数签名。
- 错误示例:
someFunc($a, [...$arr], $b)—— 这里[...$arr]是一个数组,不是展开,会传成二维结构 - 正确展开:
someFunc($a, ...$arr, $b),前提是$arr是一维数值数组,且位置与函数参数一一对应 - 关联数组不能直接展开:
...['x' => 1, 'y' => 2]会报Cannot unpack array with string keys - 混合使用时,
...必须连续放在参数列表中,不能被其他表达式隔开,否则解析失败
变量和数组交界处最麻烦的不是语法错,而是“看起来运行了,结果不对”——比如键名少个引号、引用没清理、isset 误判了 null。这些地方不报致命错误,但改起来要翻半天逻辑。










