??=仅在左侧为null或未定义时赋值,不处理false、0、''等falsy值,且不自动声明变量;若左侧变量未定义会报Notice,需先确保容器存在再使用,如$config = $config ?? [];。

整理PHP 7.4空合并赋值(??=)笔记,需紧扣其“仅在左侧为null或未定义时才赋值”的核心行为,避开对false、0、''等falsy值的误判,防止把配置兜底写成逻辑覆盖。
先厘清它不做什么
这一步必须前置——很多人踩坑是因为没看清边界。??=不处理false,不处理0,不处理空字符串,也不自动声明变量。如果左侧变量本身未定义(Notice: Undefined variable),会直接报错,不会静默初始化。
例如:$config['timeout'] ??= 30; 这行代码要求$config必须已存在且为数组;若$config根本没声明过,PHP会中断执行并抛出Notice。
正确初始化数组键的三步法
方法一:确保容器变量已就位 → 再用??=填键
第一步:用$config = $config ?? [];兜住顶层变量(兼容未定义场景)
第二步:再逐层安全赋值:$config['db']['host'] ??= 'localhost';
第三步:对深层嵌套键,可链式组合:($config['cache'] ??= [])['ttl'] ??= 3600;——注意括号不能省,否则解析失败。
对比记忆:??= vs ?: vs ||=
方法1:$x ??= 'a' → 只有$x === null或!isset($x)才触发
方法2:$x ?: 'a' → $x == false就触发,包括0、''、false、[]
方法3:$x ||= 'a' → PHP不支持该语法,是常见误写,会直接Parse error
这个区别不是风格问题,是语义鸿沟。比如计数器$count = 0;,后面跟$count ??= 1;,结果仍是0;但若误用$count ?: 1,就会得到1,逻辑彻底跑偏。
实战中必须加括号的两个场景
场景一:给动态键赋值
错误写法:$arr[$key] ??= 'default';(当$key未定义时,先报Undefined variable)
正确写法:($arr[$key] ??= 'default');不行——括号没用,关键在确保$arr和$key都已定义。
场景二:函数调用作右值$cache['user'] ??= get_user_from_api(); ——这行安全,因为??=是短路操作,get_user_from_api()只在需要时执行;但若写成$cache['user'] = $cache['user'] ?? get_user_from_api();,就失去惰性求值优势,每次都会调用API。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











