Я немного запутался по поводу приоритета операторов.
Вот пример, который не совпадает с официальный сайт php
function getValue($key) {
$array = ['un' => 1, 'six' => 6];
if (array_key_exists($key, $array)) {
return $array[$key];
}
return null;
}
var_dump(null === $t1=getValue('un'));
var_dump(null === $t2=getValue('blablablaaaaaa'));
// And now I switch
var_dump($t3=getValue('un') === null);
var_dump($t4=getValue('blablablaaaaaa') === null);
ВЫХОД
bool(false)
bool(true)
// After the switch
bool(false)
bool(true)
Это не то, что я ожидал для двух первых выходов, потому что сравнение имеет более высокий приоритет, чем назначение. Так что PHP должен был попытаться сравнить null === $t1
, или же $t1
еще не было объявлено, поэтому должно быть выдано предупреждение или ошибка или что-то еще. Или этого не произошло. Вы замечаете, что PHP иногда обрабатывает присваивание перед сравнением, хотя сравнение имеет более высокий приоритет и поэтому всегда должно выполняться перед присваиванием?. Любые объяснения по этому поводу?
Мой второй вопрос: следует ли этого избегать, всегда разделяя такого рода выражения?
ОБНОВИТЬ
N.B
var_dump($t1, $t2, $t3, $t4);
// OUTPUT
int(1)
NULL
// After the switch
bool(false)
bool(true)
===
является неассоциативным.
Неассоциативные операторы операторы, которые не имеют определенного поведения при использовании в выражении в последовательности.
И в документы
=
имеет более низкий приоритет, чем большинство других операторов, PHP по-прежнему разрешает выражения, подобные следующим: if (! $ a = foo ()), и в этом случае возвращаемое значение foo () помещается в $ a.
Так что можно предположить PHP
(в любом из выражений) сначала присваивает значение, возвращаемое функцией, переменной, а затем сравнивает.
Других решений пока нет …