Недавно я натолкнулся на такой фрагмент:
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;
Который производит продукцию 1:3
,
Глядя на оператора лист приоритета я вижу, что логические операторы ||
а также &&
имеет более высокий приоритет, чем оператор присваивания =
, Таким образом, первое выражение должно быть оценено как $x = (2 && $y) = 3;
который становится $x = (2 && null) = 3;
и, наконец, оценивает $x = false = 3;
Во-вторых, оператор присваивания имеет правильную ассоциативность, поэтому интерпретатор должен попытаться выполнить false = 3
что незаконно, конечно. Так что, по моему мнению, вышеупомянутый фрагмент кода не должен компилироваться вообще и должен выдавать синтаксический анализ или ошибку времени выполнения. Но вместо этого скрипт выдает 1: 3. Это означает, что действия, выполняемые интерпретатором:
а) $ у = 3
Би 2 && $ у
в) $ х = (2 && $ У)
Почему это так, а не в соответствии с приоритетом оператора?
лист приоритета оператора Вы ссылаетесь на штаты в виде отдельной заметки:
Хотя = имеет более низкий приоритет, чем большинство других операторов, PHP будет
разрешить выражения, подобные приведенным ниже: if (! $ a = foo ()), в
в этом случае возвращаемое значение foo () помещается в $ a.
Таким образом, по сути, присваивание внутри выражения будет рассматриваться как подвыражение. Как именно и когда это произойдет, не ясно из документации, в которой просто говорится, что «аналогичный«выражения будут работать таким образом.
Других решений пока нет …