Оператор и назначение одновременно в 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;