Используя 'или умирают ()' для остановки на ошибках в PHP

Часто в PHP, я вижу:

$result = mysql_query($query) or die();

Происходя из Python, я знаю, почему это должно работать, потому что or возвращает первое значение, если это верно в булевом контексте и втором значении иначе (см. это).

Но когда я пробую вышеупомянутую технику в PHP в другом контексте, например, что-то как:

$name = "John Doe";
echo $name or "Anonymous";

or не возвращает первое значение ("John Doe"), оно возвращается 1.

Почему это работает в mysql_query () случай результата, но не в других случаях? Это плохо для использования в mysql_query (), случай (проигнорируйте то, что я не возвращаю полезную ошибку пользователю)?

18
задан Mr.Wizard 24 November 2011 в 10:07
поделиться

7 ответов

В PHP присвоение переменной (знак равенства) и функции имеют приоритет над оператором or. Это означает, что сначала выполняется функция, а затем возвращаемое значение функции используется в сравнении or. В свою очередь, когда вы используете два значения/переменные вместе с оператором or, он сравнивает два значения сначала, а затем возвращает булево значение.

Таким образом, порядок оценки в этом примере следующий:

$result = mysql_query($query) or die();
  1. mysql_query($query)
    Возвращает либо набор результатов для запросов DQL, таких как SELECT, либо булево значение для DDL, DML или DCL запросов, таких как CREATE, DROP, INSERT, UPDATE, DELETE и ALTER.

  2. $result = mysql_query($query)
    Результат выполнения этого запроса присваивается переменной $result.

  3. $result /* = ... */ или die();
    Если это либо набор результатов, либо true, то он считается истинным (он же "правдивый"), поэтому условие or выполняется, и оператор заканчивается на этом. В противном случае вместо этого сценарий die().


echo является языковой конструкцией и поэтому фактически не возвращает значение, поэтому он не выполняется как функция до того, как будет сделано сравнение or.

Поскольку $name или "Anonymous" всегда истинно, потому что строка "Anonymous" непустая и поэтому истинна, echo неявно преобразует true в 1, отсюда и вывод.

Порядок оценки в этом примере следующий:

$name = "John Doe";
echo $name or "Anonymous";
  1. $name = "John Doe";
    Довольно просто - присваивает строку John Doe к $name.

  2. $name или "Anonymous"
    PHP обнаруживает, что $name содержит строку John Doe, поэтому в итоге оценивается следующее:

  3. "John Doe" или "Anonymous"
    Поскольку хотя бы одна строка здесь непустая, она считается истинной, и условие выполняется. Эта оценка возвращает true.

  4. echo true /* $name or... */;
    Преобразует true в 1 и выводит число 1.

33
ответ дан 30 November 2019 в 07:12
поделиться

Почему или должны возвращать что-либо? or - это обычный булевский оператор. $a или $b является истинным, если $a или $b оценивается как истинное и ложное в противном случае.

Разница между || и or в том, что or имеет меньший приоритет оператора, даже меньший, чем =. Вот почему

$result = mysql_query($query) or die();

то же самое, что и

($result = mysql_query($query)) or (die());

в то время как

$result = mysql_query($query) || die();

то же самое, что и

$result = (mysql_query($query) || die());

В вашем случае

echo $name or "Anonymous";

получает

(echo $name) or ("Anonymous");

То, что вы ищете, вероятно, является троичным оператором:

echo $name ?: 'Anonymous';

Вышеприведенное работает в PHP 5.3, если у вас только PHP 5.2, используйте:

echo $name ? $name : 'Anonymous';
2
ответ дан 30 November 2019 в 07:12
поделиться

сначала вычисляется предложение или и возвращается логическое значение, которое выводит эхо . Если вы хотите вывести текст, вам понадобится конструкция if / else, например:

echo ($name ? $name : 'Anonymous');
1
ответ дан 30 November 2019 в 07:12
поделиться

Это потому, что echo не функция, это язык построить. Он имитирует функцию, но на самом деле это не так:)

Я бы никогда не использовал die () в таком виде, это довольно грубо. Вы должны правильно обрабатывать свои ошибки, а не просто спасаться.

0
ответ дан 30 November 2019 в 07:12
поделиться

PHP делает то, что часто называют «жонглированием шрифтами». Другими словами: PHP преобразует тип любого значения для текущего варианта использования. Поскольку строки будут преобразованы в «истинные» значения, ваше выражение вернет истину. Но echo хочет напечатать строковое выражение и преобразует "true" в 1. В некоторых случаях это раздражает, но если вы это знаете, вы также знаете, как с этим справиться;)

Кстати, посмотрите это: http://php.net/manual/en/types.comparisons.php

1
ответ дан 30 November 2019 в 07:12
поделиться

Причина на самом деле пришла мне в голову вскоре после того, как я задал вопрос. Речь идет о приоритете операторов. = встречается перед или , поэтому:

$result = mysql_query($query) or die();

эквивалентно:

($result = mysql_query($query)) or die();

not:

$result = (mysql_query($query) or die());

, как это было бы в Python. Итак, это:

$a = false or true;

установит для $ a значение false, а не true, что обязательно поймает меня в какой-то момент в будущем.

2
ответ дан 30 November 2019 в 07:12
поделиться

Если вы хотите воспроизвести это поведение И выводить на экран / браузер, вам нужна функция, которая будет возвращать что-то отличное от ИСТИНА. printf () может сделать это за вас.

echo microtime."&lt;br&gt;";<
$str = "";
printf("%s",$str) or die();
echo "&lt;br&gt;".microtime();

Если $ str пусто, равно null или false, будет вызвана die (), в противном случае скрипт завершит выполнение.

0
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: