Использование 'или 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() (игнорируйте тот факт, что я не возвращаю пользователю полезную ошибку)?
Ответы
Ответ 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."<br>";<
$str = "";
printf("%s",$str) or die();
echo "<br>".microtime();
Если $str пусто, null или false, будет вызван die(), иначе script завершит выполнение.