PHP 7.2中三元运算符可给已定义数组的键赋值,但不能对未定义变量或非法左值操作;推荐先声明数组再赋值,或用数组合并、解构语法构造,默认值优先用??操作符。

PHP 7.2 中三元运算符可以直接给数组元素赋值,但不能直接“赋值整个数组”并期望它自动创建或覆盖原数组结构——关键在于**操作目标必须是可写变量(左值)**,比如已定义的数组变量、数组下标或对象属性。
给已存在数组的某个键赋值
最常见且安全的做法:先确保数组已声明,再用三元运算符决定具体值:
<?php
$data = [];
$data['status'] = $is_success ? 'ok' : 'error';
$data['code'] = $is_success ? 200 : 500;
?>
初始化带默认值的数组(推荐写法)
用三元运算符生成键值对,再合并进数组,语义清晰、不易出错:
立即学习“PHP免费学习笔记(深入)”;
- 单独构造子数组后合并:
$arr = ['id' => $id] + ($is_valid ? ['name' => $name, 'type' => 'user'] : []); - 使用数组解构(PHP 7.1+)更简洁:
$arr = [
'id' => $id,
...($is_valid ? ['name' => $name, 'type' => 'user'] : [])
];
避免常见错误
以下写法在 PHP 7.2 中会报错或行为异常:
-
错误:对未定义变量直接三元赋数组
$config = $use_cache ? ['cache' => true] : ['cache' => false]; // ✅ 可以,这是赋值给变量
$items[] = $has_data ? ['a'=>1] : []; // ❌ $items 未定义时,$items[] 无法作为左值 -
错误:试图用三元结果直接当数组名赋值
($flag ? $arr1 : $arr2)['key'] = 'value'; // ❌ 不是合法左值,PHP 7.2 不支持
替代方案:使用 null 合并或函数封装
逻辑复杂时,建议封装成函数或使用 null 合并操作符提升可读性:
<?php
// 利用 ?? 简化默认值
$user = [
'name' => $input_name ?? 'anonymous',
'role' => $is_admin ? 'admin' : ($is_editor ? 'editor' : 'user')
];
?>



















