Использование '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();
mysql_query($query)
Возвращает либо результирующий набор для запросов DQL, таких какSELECT
, или логическое значение для запросов DDL, DML или DCL, таких какCREATE
,DROP
,INSERT
,UPDATE
,DELETE
иALTER
.$result = mysql_query($query)
Результат выполнения этого запроса присваивается переменной$result
.$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";
$name = "John Doe";
Довольно просто - присваивает строку Вася Пупкин до$name
.$name or "Anonymous"
В PHP обнаруживает, что$name
содержит строку Вася Пупкин, так что в конечном итоге оценивается следующий:"John Doe" or "Anonymous"
Поскольку по крайней мере одна строка здесь непустая, она считается истинной, и условие выполняется. Эта оценка затем возвращаетtrue
.echo true /* $name or... */;
Новообращенныеtrue
to1
и печатает число 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."<br>";<
$str = "";
printf("%s",$str) or die();
echo "<br>".microtime();
Если $str пуст, null или false, будет вызываться die (), иначе скрипт завершит выполнение.