Оператор и назначение одновременно в PHP?
В этом утверждении:
1 + $newVar = 200;
$ newVar создается и назначается значение 200. Как это работает? Приоритетные правила показывают, что добавление происходит сначала перед назначением. Я не могу обмотать голову вокруг этого. Как выполняется присвоение, если сначала оценивается переменная с помощью оператора +?
PHP предоставляет этот маленький самородок. Означает ли это, что эти правила применяются, за исключением случаев, когда они этого не делают?
Замечания:
Хотя = имеет более низкий приоритет, чем большинство других операторов, PHP все равно позволит выражениям, аналогичным следующим: if (! $ A = foo()), и в этом случае возвращаемое значение foo() помещается в $ a.
Ответы
Ответ 1
В этом случае PHP не должен оценивать арифметическое выражение перед назначением, поскольку арифметический оператор возвращает значение, и вы не можете присвоить value
value
. Поэтому кажется, что PHP в этом случае немного нарушает свои правила и сначала выполняет назначение.
Сначала отображается код для показа назначения:
$nVar = 0;
echo (1 + $nVar = 200); //201
echo $nVar; //200
Если сначала произошло +
(и каким-то образом было законным и имело смысл), они оба будут эхо 200
, потому что (1 + $ nVar) не устанавливает $ nVar в 1, и вы получите результат назначения.
Посмотрите также на этот пример:
$nVar = true;
echo (!$nVar = false); // true | 1
echo '<br/>br<br/>';
var_dump($nVar); // false
!
имеет более высокий приоритет и также является правильной ассоциативной, но назначение по-прежнему оценивается в первую очередь.
Ответ 2
Как выполняется присвоение, если сначала оценивается переменная с помощью оператора +?
Оператор +
не обязательно сначала оценивается, и документы довольно ясно об этом
Приоритет операторов и ассоциативность определяют только то, как сгруппированы выражения, они не определяют порядок оценки. PHP (в общем случае) не указывает, в каком порядке оценивается выражение, а код, который предполагает определенный порядок оценки, следует избегать, поскольку поведение может изменяться между версиями PHP или в зависимости от окружающего кода.
И, тестируя несколько сценариев в разных версиях, становится ясно, что сначала выполняется оценка оператора присваивания (как вы заметили), так как оценка оператора +
сначала вызовет ошибку синтаксического анализа:
(1 + $n) = 200;
Ошибка PHP Parse: синтаксическая ошибка, неожиданный '=' в коде оболочки php в строке 1
Если вы хотите быть уверенными в том, как это будет выполняться в разных версиях, наилучшей практикой будет предоставление более четкой группировки для желаемых результатов - например:
1 + ($n = 200);
Ответ 3
Я не совсем уверен в этом ответе. Кто-то может помочь мне здесь, если будет лучше.
Этот файл находится из источника PHP (https://github.com/php/php-src/blob/eb39d8d6863ab1f327417b274fed7a41b58daf1e/Zend/zend_language_parser.y)
Если вы посмотрите, это точка, в которой интерпретатор оценивает выражение.
В первый раз он выберет номер 1
, затем знак +
, который будет вычисляться expr '+' expr
(ссылка).
В следующий раз второй expr
вычисляется как variable '=' expr
($ newVar = 200) (ссылка). Решая это, внутренне,
expr(1) + expr($newVar = 200)
expr(1) + expr($newVar(200))
201
Если вы выполните echo (1.00 + $newVar = 200);
он будет выводить 201, но $newVar
получил 200;