Сегодня решил сделать над собой усилие и наконец-то выучить приоритеты выполнения операторов, или, говоря нормальным языком – operator precedence rules.
Так как я всегда использую скобки для явного указания очередности исполнения операторов, особых проблем с операторами у меня не было. Однако, готовясь к сертификации, я подумал, что возможно стоит именно знать, а не просто иметь представление.
Рассмотрим небольшой пример:
$x = 1; var_dump(!$x * 5); // int(0)
Результат вполне ожидаем: так как ! имеет более выский приоритет (унарные операторы являются одними из самых приоритетных, выше только квадратная скобка [ и оператор new), то сначала преобразовывается выражение
!$x // !1 = 0
а затем уже происходит умножение на 5, что и дает общий результат равный нулю.
Однако мы не можем применять ту же логику в выражении ниже (хотя, следуя документации логика абсолютно легитимна):
var_dump(!$x = 5); // bool(false)
Несмотря на то что знак равенства =, так же как и знак плюса в примере выше, имеет меньший приоритет, чем унарный оператор !, PHP достаточно умен чтобы не интерпритировать все буквально (иначе должна быть выдана Parse Error – так как выражение 0 = 5, полученное следуя правилам очередности операторов, не имеет смысла). PHP парсер сначала выполняет
$x = 5;
и только после этого применяет оператор отрицания !, что и дает нам результат:
bool(false)
Удачных выходных!

no comment untill now