Подтвердить что ты не робот

Использование 'или die()' для остановки ошибок в 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() (игнорируйте тот факт, что я не возвращаю пользователю полезную ошибку)?

4b9b3361

Ответ 1

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

Следовательно, порядок оценки в этом примере:

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

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

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


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

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

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

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

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

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

  • echo true /* $name or... */;
    Преобразует true в 1 и печатает номер 1.

Ответ 2

Почему 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());

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

echo $name or "Anonymous";

получает

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

То, что вы ищете, вероятно, это тернарный оператор:

echo $name ?: 'Anonymous';

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

echo $name ? $name : 'Anonymous';

Ответ 3

Причина действительно возникла у меня вскоре после вопроса. Это о приоритете оператора. = происходит до 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 в значение false, а не значение true, которое в какой-то момент в будущем будет уловлено.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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