首页 > 解决方案 > 为什么 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'] ?? '');

但我正在寻找它背后的原因。

标签: phpphp-7

解决方案


每个运算符都有自己的“重要性”(运算符优先级,正如@Karsten-koop 指出的那样),它决定了它们的执行顺序。例如:

echo 10 + 5 * 3; // 25 (10+15), not 45 (15×3)

在这种情况下:

$val = "sgadjgjsd".$array['c'] ?? '';

PHP 将执行以下步骤:

  1. sgadjgjsd连接 (.)值为的字符串$array['c']
  2. $array['c']不存在,因此发出通知。
  3. 然后通过 null 合并运算符运行最终结果 ( sgadjgjsd),并且由于字符串不等于 null,因此返回字符串 (not '')。
  4. 最终结果分配给名为 的变量$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.

http://php.net/manual/en/language.operators.precedence.php

旁注:您可能会从学校认识到同样的概念,因为数学中存在同样的东西为什么会有一些历史背景)。


推荐阅读