Это практика, которую я видел раньше, но не очень часто: переменная присваивается значению в то же самое время, когда оценивается само значение (или это само вычисление оценивается?). Пример:
// 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
Это кажется настолько базовым, но на самом деле я не могу найти документацию , возможно, я не уверен, где искать. Я только недавно понял, как это работает, видя его в течение многих лет, и мне очень нравится использовать его, но я не хочу использовать его беспорядочно.
Это делает код короче, возможно, не совсем понятным для некоторых, но определенно менее повторяющимся. Существуют ли какие-либо предостережения с этим методом? Является ли это абсолютно безопасным или существуют случаи, когда он может потерпеть неудачу или вызвать неожиданное поведение? Это, похоже, не очень распространенная практика, поэтому я надеялся найти объяснение, прежде чем начинать «сходить с ума». Если это задокументировано, ссылки на правильную страницу будут высоко оценены.
С 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
$value
. Поэтому распространенная ошибка заключается в том, чтобы написать
if ($a = $b)
когда он должен был написать
if ($a == $b)
может произойти при наборе текста.
В PHP в принципе «все, что имеет значение» является выражением.