Использование 'or die ()' для остановки ошибок в PHP

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

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

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

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

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

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

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

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 /* = ... */ or die();
    Если это результирующим набором или true, это считается правдой (он же "правдивый"), так что or условие выполнено, и утверждение заканчивается здесь. В противном случае скрипт die() вместо.


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

As $name or "Anonymous" всегда верно, потому что строка "Anonymous" непусто и, следовательно, честная, the echo неявное преобразование true to 1, следовательно, выходной.

порядок оценки в этом примере:

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

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

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

  4. echo true /* $name or... */;
    Новообращенные true to 1 и печатает число 1.


зачем or что-нибудь вернуть? or является нормальным логическим оператором. $a or $b и true если $a или $b оценивает в true и false иначе.

разницу между || и or, что or имеет более низкий прецедент оператора, даже ниже, чем =. Вот почему

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

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

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

, тогда как

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

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

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

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

echo $name or "Anonymous";

получает

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

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

echo $name ?: 'Anonymous';

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

echo $name ? $name : 'Anonymous';

причина действительно пришла мне в голову вскоре после того, как я задал вопрос. Это Про Операторов. The = бывает перед or, так:

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

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

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

нет:

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

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

$a = false or true;

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


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

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


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

echo ($name ? $name : 'Anonymous');

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

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


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

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

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