Использование 'или die ()' для остановки на ошибках в PHP - PullRequest
18 голосов
/ 21 июля 2010

Часто в PHP я вижу:

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

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

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

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

orне возвращает первое значение («Джон Доу»), оно возвращает 1.

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

Ответы [ 7 ]

33 голосов
/ 21 июля 2010

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

Следовательно, порядок вычисления в этом примереis:

$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.

Поскольку $name or "Anonymous" всегда верно, поскольку строка "Anonymous" не пуста и, следовательно, истинна, echo неявно преобразует true в 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 в 1 и печатает число 1.

2 голосов
/ 21 июля 2010

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

2 голосов
/ 21 июля 2010

Зачем 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';
1 голос
/ 21 июля 2010

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

echo ($name ? $name : 'Anonymous');
1 голос
/ 21 июля 2010

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

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

0 голосов
/ 21 июля 2010

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

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

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

0 голосов
/ 21 июля 2010

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

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

...