php - 为什么 PHP isset 和 Null 合并运算符使用连接运算符抛出通知?
问题描述
我已阅读 PHP isset 和 null 合并运算符用于忽略PHP 注意:未定义索引:
我也看过这篇文章 PHP 三元运算符 vs 空合并运算符
但是在将它们与字符串连接运算符一起使用时,我得到了它们的 PHP 通知:
<?php
$array = ['a'=>'d'];
$c = $array['c'] ?? '';
$d = isset($array['c']) ? $array['c'] : '';
$val = "sgadjgjsd".$array['c'] ?? ''; // PHP Notice: Undefined index: c in /home/cg/root/986045/main.php on line 6
$val2 = "sgadjgjsd".isset($array['c']) ? $array['c'] : ''; // PHP Notice: Undefined index: c in /home/cg/root/986045/main.php on line 7
?>
编辑:
我知道这可以通过以下方法解决
1)分配给变量,如
$val = "sgadjgjsd".$c = $array['c'] ?? '';
2) 使用@
$val = "sgadjgjsd".@$array['c'] ?? '';
3)添加括号(和Karsten建议的那样)
$val = "sgadjgjsd".($array['c'] ?? '');
但我正在寻找它背后的原因。
解决方案
每个运算符都有自己的“重要性”(运算符优先级,正如@Karsten-koop 指出的那样),它决定了它们的执行顺序。例如:
echo 10 + 5 * 3; // 25 (10+15), not 45 (15×3)
在这种情况下:
$val = "sgadjgjsd".$array['c'] ?? '';
PHP 将执行以下步骤:
sgadjgjsd
连接 (.)值为的字符串$array['c']
。$array['c']
不存在,因此发出通知。- 然后通过 null 合并运算符运行最终结果 (
sgadjgjsd
),并且由于字符串不等于 null,因此返回字符串 (not''
)。 - 最终结果分配给名为 的变量
$val
。
那么为什么 10 + 5 * 3 等于 25?在链接页面的表格中查找*
和运算符。+
请注意,*
它在列表中较高,所以它排在第一位。
对于另一个示例,连接运算符.
(相当多)高于??
.
使用括号是正确的解决方案;它们允许您指定首先发生的事情:
echo (10 + 5) * 3;
$val = "sgadjgjsd".($array['c'] ?? '');
// Does ?? first and returns either the value of $array['c'] or ''
// and only then it does the string concatenation and assignment to $val.
推荐阅读
- apache-spark - 如何在 Jupyter notebook 中使用 Kafka 数据源?
- c++ - c ++模板,两个不同文件中的重复类名,静态初始化
- html - 如何在html表格的一行中创建两组单选按钮
- multidimensional-array - 如何遍历工作表中的所有行以查找匹配项?
- yocto - 将自定义 Yocto 映像闪烁到 Jetson Nano 生产模块 eMMC?
- typescript - 使用关系记录丰富 Feathers 服务的设计模式
- kubernetes - 来自特使对 BAN 请求的 Http 400
- orientation - IOS 13 横向和纵向切换后安全区域中断
- go - 在数组中的索引处插入元素并按值删除元素
- docker - 如何在 .Net 核心项目中使用 Azure Artifacts 源创建 docker 映像