为什么PHP isset和Null合并运算符抛出带连接运算符的注意事项?

Roh*_*man 1 php php-7

我已经读过PHP isset和null合并运算符用于忽略PHP注意:未定义的索引:

我已经看到这篇文章也是 PHP三元运算符vs null合并运算符

但是我在使用字符串连接运算符的同时使用它们获取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
?>
Run Code Online (Sandbox Code Playgroud)

编辑:

我知道这可以通过以下方法解决

1)分配给变量

$val = "sgadjgjsd".$c = $array['c'] ?? '';
Run Code Online (Sandbox Code Playgroud)

2)使用@

$val = "sgadjgjsd".@$array['c'] ?? '';
Run Code Online (Sandbox Code Playgroud)

3)添加括号(和Karsten建议的那样)

$val = "sgadjgjsd".($array['c'] ?? '');
Run Code Online (Sandbox Code Playgroud)

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

Rik*_*kus 5

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

echo 10 + 5 * 3; // 25 (10+15), not 45 (15×3)
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

$val = "sgadjgjsd".$array['c'] ?? '';
Run Code Online (Sandbox Code Playgroud)

PHP将执行以下步骤:

  1. 连接(.)字符串sgadjgjsd的值为$array['c'].
  2. $array['c'] 不存在,因此发出通知.
  3. 然后,最终结果(sgadjgjsd)通过空合并运算符运行,并且由于该字符串不等于null,因此返回字符串(不是'').
  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.
Run Code Online (Sandbox Code Playgroud)

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

旁注:你可能会从学校认识到这个相同的概念,因为数学中存在同样的东西(一些历史背景为什么).