Странные способы «или» в PHP

PHP or это странное ключевое слово. Здесь он находится в фрагменте кода, который меня смущает:

 echo 0 or 1; // prints 1 $foo = (0 or 1); echo $foo; // prints 1 $foo = 0 or 1; echo $foo; // prints 0 for some reason 

Почему последний печатает 0, а не 1?

Related of "Странные способы «или» в PHP"

Это связано с разным приоритетом оператора . В третьем случае назначение выполняется первым. Он будет интерпретироваться так:

 ($foo = 0) or 1; 

|| оператор имеет другой приоритет. Если вы используете

  $foo = 0 ||1; 

Он будет работать так, как вы ожидаете.

См. Руководство по логическим операторам

Нет, я бы не стал, это из-за приоритета оператора :

  $foo = 0 or 1; // is same as ($foo = 0) or 1; // because or has lower precedence than = $foo = 0 || 1; // is same as $foo = (0 || 1); // because || has higher precedence than = // where is this useful? here: $result = mysql_query() or die(mysql_error()); // displays error on failed mysql_query. // I don't like it, but it's okay for debugging whilst development. 

Это ($foo = 0) or 1; , or имеет более низкий приоритет оператора, чем = .

Вы должны использовать || в этом случае, поскольку он имеет более высокий приоритет, чем = , и, следовательно, будет оцениваться так, как вы ожидали.

IIRC, оператор присваивания ( = ) имеет более высокий приоритет, чем or . Таким образом, последняя строка будет интерпретироваться как:

 ($foo = 0) or 1; 

Это утверждение, которое присваивает 0 в $foo , но возвращает 1. Первый оператор интерпретируется как:

 echo(0 or 1); 

Как таковой будет печатать 1.

Порядок операций. Слово «или» имеет гораздо более низкий приоритет, чем соответствующий «||». Нижний, четный, чем оператор присваивания. Таким образом, назначение происходит сначала, а значение присваивания – это первый операнд к «или».

«или» означает больше для управления потоком, чем для логических операций. Это позволяет вам сказать что-то вроде

 $x = get_something() or die("Couldn't do it!"); 

если get_something закодирован, чтобы вернуть false или 0 при ошибке.

В первых двух фрагментах вы сравниваете 0 или 1 (по существу, true или false). В третьем фрагменте вы назначаете 0, который работает и, следовательно, имеет значение true, поэтому условие или не выполняется. подчеркнутый текст

В третьем примере оператор = имеет более высокий приоритет, чем или, и, таким образом, делается первым. || оператор, внешне одинаковый, имеет более высокий приоритет, чем =. Как вы говорите, интересно.