Как работает «сделать что-то или умереть ()» в PHP? - PullRequest
95 голосов
/ 11 января 2009

Я пишу php-приложение для доступа к базе данных MySQL, и в учебном пособии говорится что-то вроде

mysql_connect($host, $user, $pass) or die("could not connect");

Как PHP узнает, что функция завершилась с ошибкой и запустила часть матрицы? Я предполагаю, что спрашиваю, как "или" часть этого работает. Я не думаю, что видел это раньше.

Ответы [ 4 ]

130 голосов
/ 11 января 2009

Если первый оператор возвращает true, то весь оператор должен быть true, поэтому вторая часть никогда не выполняется.

Например:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

Поэтому, если ваш запрос не выполнен, он оценит оператор die() и завершит выполнение сценария.

32 голосов
/ 11 января 2009

PHP or работает как C || (что, кстати, также поддерживается PHP - or просто выглядит лучше и имеет другой оператор приоритет - см. эту страницу ).

Он известен как оператор короткого замыкания , потому что он пропустит любые оценки, когда у него будет достаточно информации для определения окончательного значения.

В вашем примере, если mysql_connect() вернет TRUE, тогда PHP уже знает, что весь оператор будет иметь значение TRUE, независимо от того, к чему die() переходит, и, следовательно, die() не оценивается.

Если mysql_connect() возвращает FALSE, PHP не знает, будет ли весь оператор иметь значение TRUE или FALSE, поэтому он продолжает работу и пытается вычислить die() - завершение сценария в процессе.

Это просто хороший трюк, использующий преимущества работы or.

11 голосов
/ 11 января 2009

Работает так, как описали другие.

В PHP не используйте «die», так как он НЕ вызывает исключение (как в Perl). Вместо этого бросьте исключение правильно обычным способом.

die не может быть перехвачен в PHP и не регистрируется - вместо этого он печатает сообщение неблагодарно и немедленно выходит из сценария, никому ничего не сообщая или давая вам возможность записать событие, повторить попытку и т. Д.

0 голосов
/ 31 августа 2010
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
...