Как работает назначение переменных в выражении? - PullRequest
3 голосов
/ 27 августа 2011

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

// 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

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

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

Ответы [ 4 ]

3 голосов
/ 27 августа 2011

С 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; (точка с запятой обозначает конец оператора).Поскольку задания анализируются в порядке справа налево, вы также можете написать $b = $a = 5.

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

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

и

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

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

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

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

2 голосов
/ 27 августа 2011

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

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

Есть ли какие-либо оговорки с этим методом?

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

if ($pos = strpos("a","aaa"))...
1 голос
/ 27 августа 2011

Как работает назначение переменных в выражении?

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

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

if ($var = $value)

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

Поэтому распространенная ошибка - написать

if ($a = $b)

когда предполагалось написать

if ($a == $b)

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

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

1 голос
/ 27 августа 2011

Результат присвоения является результатом выражения правой руки, поэтому $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.

...