Каждый оператор имеет свою собственную «важность» ( приоритет оператора , как указывал @ Karsten-koop), который определяет, в каком порядке они выполняются.Например:
echo 10 + 5 * 3; // 25 (10+15), not 45 (15×3)
В этом случае:
$val = "sgadjgjsd".$array['c'] ?? '';
PHP выполнит следующие действия:
- Объединит (.) Строку
sgadjgjsd
со значением $array['c']
. $array['c']
не существует, поэтому отправляется уведомление. - Конечный результат (
sgadjgjsd
) затем пропускается через нулевой оператор объединения,и поскольку строка не равна нулю, возвращается строка (не ''
). - Конечный результат присваивается переменной с именем
$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
Примечание: вы можете узнать это же понятие из школы, потому что то же самое существует в математике ( некоторые исторические сведения о , почему ).