Часто в 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 (), случай (проигнорируйте то, что я не возвращаю полезную ошибку пользователю)?
В 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 /* = ... */ или die();
Если это либо набор результатов, либо true
, то он считается истинным (он же "правдивый"), поэтому условие or
выполняется, и оператор заканчивается на этом. В противном случае вместо этого сценарий die()
.
echo
является языковой конструкцией и поэтому фактически не возвращает значение, поэтому он не выполняется как функция до того, как будет сделано сравнение or
.
Поскольку $name или "Anonymous"
всегда истинно, потому что строка "Anonymous"
непустая и поэтому истинна, echo
неявно преобразует true
в 1
, отсюда и вывод.
Порядок оценки в этом примере следующий:
$name = "John Doe";
echo $name or "Anonymous";
$name = "John Doe";
Довольно просто - присваивает строку John Doe к $name
.
$name или "Anonymous"
PHP обнаруживает, что $name
содержит строку John Doe, поэтому в итоге оценивается следующее:
"John Doe" или "Anonymous"
Поскольку хотя бы одна строка здесь непустая, она считается истинной, и условие выполняется. Эта оценка возвращает true
.
echo true /* $name or... */;
Преобразует true
в 1
и выводит число 1.
Почему или
должны возвращать что-либо? 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';
сначала вычисляется предложение или
и возвращается логическое значение, которое выводит эхо
. Если вы хотите вывести текст, вам понадобится конструкция if / else, например:
echo ($name ? $name : 'Anonymous');
Это потому, что echo не функция, это язык построить. Он имитирует функцию, но на самом деле это не так:)
Я бы никогда не использовал die () в таком виде, это довольно грубо. Вы должны правильно обрабатывать свои ошибки, а не просто спасаться.
PHP делает то, что часто называют «жонглированием шрифтами». Другими словами: PHP преобразует тип любого значения для текущего варианта использования. Поскольку строки будут преобразованы в «истинные» значения, ваше выражение вернет истину. Но echo хочет напечатать строковое выражение и преобразует "true" в 1. В некоторых случаях это раздражает, но если вы это знаете, вы также знаете, как с этим справиться;)
Кстати, посмотрите это: http://php.net/manual/en/types.comparisons.php
Причина на самом деле пришла мне в голову вскоре после того, как я задал вопрос. Речь идет о приоритете операторов. =
встречается перед или
, поэтому:
$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, что обязательно поймает меня в какой-то момент в будущем.
Если вы хотите воспроизвести это поведение И выводить на экран / браузер, вам нужна функция, которая будет возвращать что-то отличное от ИСТИНА. printf () может сделать это за вас.
echo microtime."<br>";<
$str = "";
printf("%s",$str) or die();
echo "<br>".microtime();
Если $ str пусто, равно null или false, будет вызвана die (), в противном случае скрипт завершит выполнение.