Как выполняется назначение переменной в выражении?

Это практика, которую я видел раньше, но не очень часто: переменная присваивается значению в то же самое время, когда оценивается само значение (или это само вычисление оценивается?). Пример:

// Outputs "The value is 1" $value = 1; if ($var = $value) { echo "The value is $var"; } 

Кажется, это то же самое, что:

 $value = 1; $var = $value; if ($var) { echo "The value is $var"; } 

Другой пример:

 // Outputs "The value is 1" $value = 1; echo "The value is ".$var = $value; 

Я немного использовал это, чтобы сократить мой код, главным образом первый пример: для оценки первой переменной или выражения при назначении ее другому в пределах того же выражения. Что-то вроде этого:

 if ($status = User::save($data)) { echo "User saved."; } // do something else with $status 

Это кажется настолько базовым, но на самом деле я не могу найти документацию , возможно, я не уверен, где искать. Я только недавно понял, как это работает, видя его в течение многих лет, и мне очень нравится использовать его, но я не хочу использовать его беспорядочно.

Это делает код короче, возможно, не совсем понятным для некоторых, но определенно менее повторяющимся. Существуют ли какие-либо предостережения с этим методом? Является ли это абсолютно безопасным или существуют случаи, когда он может потерпеть неудачу или вызвать неожиданное поведение? Это, похоже, не очень распространенная практика, поэтому я надеялся найти объяснение, прежде чем начинать «сходить с ума». Если это задокументировано, ссылки на правильную страницу будут высоко оценены.

Solutions Collecting From Web of "Как выполняется назначение переменной в выражении?"

С http://uk3.php.net/manual/en/language.expressions.php :

PHP принимает выражения намного дальше, точно так же, как это делают многие другие языки. PHP – это язык, ориентированный на выражение, в том смысле, что почти все является выражением. Рассмотрим пример, который мы уже рассмотрели, $a = 5 . Легко видеть, что здесь задействованы два значения, значение целочисленной константы 5 и значение $a которое также обновляется до 5. Но правда в том, что здесь есть еще одна ценность, и это значение самого присваивания. В этом случае само присваивание оценивается назначенным значением 5. На практике это означает, что $a = 5 , независимо от того, что он делает, является выражением со значением 5. Таким образом, записывая что-то вроде $b = ($a = 5) подобен записи $a = 5; $b = 5; $a = 5; $b = 5; (точка с запятой знаменует конец инструкции). Поскольку присваивания анализируются в порядке справа налево, вы также можете написать $b = $a = 5 .

Многие люди утверждают, что вы не должны использовать это поведение очень часто. Например, различая:

 if ($a == 5) { ... } 

а также

 if ($a = 5) { ... } 

сложно! Два общих идиоматических способа написать выше, чтобы отличить их:

 if (5 == $a) { ... } if (($a = 5)) { ... } 

Первый называется условием yoda и вызывает синтаксическую ошибку, если символ равенства отсутствует. Последний не будет вести себя иначе при запуске, но некоторые проверки кода выдадут предупреждения, когда выражение не имеет дополнительных скобок.

http://php.net/manual/en/language.operators.precedence.php – это то, что вам, вероятно, нужно.

Выраженные выражения PHP, в свою очередь, с наивысшим приоритетом ниже.
Итак, сначала мы оцениваем присваивание, а затем применяем к нему условное утверждение. Существует также некоторая магическая манипуляция типа , чтобы преобразовать возвращаемое значение в boolean на лету

Существуют ли какие-либо предостережения с этим методом?

Конечно. Если нулевым значением является действительное возвращаемое значение, ваш код может вас лишить. Общим примером является функция strpos ():

 if ($pos = strpos("a","aaa"))... 

Результат присваивания – результат выражения правой руки, поэтому значение $var = $value оценивается $value . Теперь вы должны учитывать, что именно означает FALSE или TRUE в PHP.

Из документации :

 FALSE: the boolean FALSE itself the integer 0 (zero) the float 0.0 (zero) the empty string, and the string "0" an array with zero elements an object with zero member variables (PHP 4 only) the special type NULL (including unset variables) SimpleXML objects created from empty tags TRUE: everything not listed above 

Если if присваивается значение TRUE .

Как выполняется назначение переменной в выражении?

Это очевидно, может быть, слишком очевидно, поэтому я говорю: всегда то же самое. Выражение представляет собой выражение Docs .

Давайте разберем это:

 if ($var = $value) [1] := if ([2]) [2] := $var = $value 
  1. Является выражением if. Это логическое значение [2].
  2. Является выражением переменной присваивания. Результаты в значении $value .

Поэтому распространенная ошибка заключается в том, чтобы написать

 if ($a = $b) 

когда он должен был написать

 if ($a == $b) 

может произойти при наборе текста.

В PHP в принципе «все, что имеет значение» является выражением.