Как в PHP работает «сделать что-нибудь ИЛИ УМЕРТЬ ()»?


99

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

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

Как PHP узнает, что функция завершилась неудачно, и запускает часть кристалла? Думаю, я спрашиваю, как работает часть «или». Не думаю, что видел это раньше.


3
Кстати, не используйте такую ​​логику в реальных приложениях. Меня до сих пор поражает, сколько руководств это делают.
Эран Гальперин

2
Почему бы не использовать это? Это действительно красиво и
легко

11
Это может быть простым и подходящим для учебника, но вы не хотите, чтобы ваш скрипт некрасиво умирал с таким сообщением об ошибке на глазах у реальных пользователей. Отображение настраиваемой страницы ошибки (без указания фактической ошибки!) + Регистрация ошибки является обязательной.
Эран Гальперин

4
Я говорю об «или», а не о «кубике».
Artelius

21
mysql_connect ($ host, $ user, $ pass) или PrintNiceError ('DatabsaeConnectionError');
Matpie

Ответы:


134

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

Например:

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

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

Таким образом, если ваш запрос завершится неудачно, он оценит die()оператор и завершит скрипт.


1
Хорошее объяснение. Эта языковая конструкция PHP "подразумеваемое если" немного опасна, потому что у вас могут быть операторы, которые, по вашему мнению, выполняются, но на самом деле не выполняются, и это не так очевидно, как если бы у вас был блок if.
Петруза, 07

6
Это называется оценкой короткого замыкания и также полезно для языков, отличных от PHP.
Мистер Гривер

1
Кстати, вы можете использовать только один оператор после OR. Оператор блока не сможет проверить синтаксис (например, фактическое сообщение об ошибке может быть синтаксической ошибкой: синтаксическая ошибка, неожиданный '{' в ...)
Скотт Чу

И здесь я подумал, что это какая-то расширенная функция, такая как withинструкция python , когда на самом деле это просто логическое выражение ... Я думаю, что при использовании этого выражения следует проявлять особую осторожность, если ожидается, что вы выполните очистку в случае ошибки. Пожалуйста, поправьте меня, если я ошибаюсь, но если вы это сделаете func_call($file) or die();и функция не работает, то файл останется открытым, когда скрипт умирает.
pedromanoel

@Petruza Это вообще хорошая практика orв ситуациях, когда ifможет сработать?
Limeandcoconut

32

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

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

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

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

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


+1 для обозначения короткого замыкания. Также мог быть назван «побочный эффект». Нас совершенно не интересует код возврата die (), нам просто нужен эффект от его выполнения. (Это не всегда будет die ()). Это не всегда нравится пуристам, поскольку некоторые эффекты могут быть неясными.
mckenzm 05

и это еще не все. вы также можете использовать и комбинировать вещи, когда вы хотите, чтобы одна вещь определенно работала, прежде чем делать вторую.
My1

11

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.