Почему PHP isset и оператор объединения Null генерируют Notice с оператором объединения? - PullRequest
0 голосов
/ 28 ноября 2018

Я прочитал, что PHP isset и оператор объединения нулей используются для игнорирования Примечание PHP: Неопределенный индекс:

Я также видел этот пост Тернарный оператор PHP против оператора объединения нулей

Но я получаю уведомление 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) добавление скобок (икак предложил Карстен)

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

Но я ищу причину этого.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Каждый оператор имеет свою собственную «важность» ( приоритет оператора , как указывал @ 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. Конечный результат (sgadjgjsd) затем пропускается через нулевой оператор объединения,и поскольку строка не равна нулю, возвращается строка (не '').
  4. Конечный результат присваивается переменной с именем $val.

Такпочему 10 + 5 * 3 равно 25?Найдите операторы * и + в таблице на связанной странице.Обратите внимание, что * выше в списке, поэтому он идет первым.
В другом примере оператор объединения 10 * * (совсем немного) выше, чем ??.

.Использование скобок - правильное решение;они позволяют вам указать, что идет первым:

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

Примечание: вы можете узнать это же понятие из школы, потому что то же самое существует в математике ( некоторые исторические сведения о , почему ).

0 голосов
/ 28 ноября 2018

Это потому, что вы хотите объединить строку с нулем в первом случае, а во втором - с логическим значением

$val = $array['c'] ?? '';

не будет выдавать какую-либо ошибку, но объединение всего другого типа данных с другим будетошибка выбрасывания.

...