Як в PHP працює "зробити щось АБО СТВОРИТИ ()"?


99

Я пишу додаток php для доступу до бази даних MySQL, а в навчальному посібнику написано щось із форми

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

Звідки PHP знає, що функція вийшла з ладу, щоб вона запускала частину штампу? Я думаю, я запитую, як працює «чи» його частина. Я не думаю, що я бачив це раніше.


3
В сторону не використовуйте таку логіку у фактичних програмах. Мене все ще дивує, скільки навчальних посібників це роблять.
Еран Гальперін

2
Чому б не використовувати його? Це дійсно приємно і читабельно ...
rkj

11
Це може бути простим і підходящим для навчального посібника, але ви не хочете, щоб ваш скрипт невдячно загинув із таким повідомленням про помилку перед реальними користувачами. Показ спеціальної сторінки помилок (без зазначення фактичної помилки!) + Реєстрація помилки є обов’язковою.
Еран Гальперін

4
Я говорю про "чи", а не про "померти".
Артелій

21
mysql_connect ($ хост, $ користувач, $ пропуск) або PrintNiceError ("DatabsaeConnectionError");
матір

Відповіді:


133

Якщо перше твердження повертається true, то весь вислів повинен бути, trueтому друга частина ніколи не виконується.

Наприклад:

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

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

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


1
Гарне пояснення. Це "мається на увазі, якщо" мовна конструкція PHP є трохи небезпечною, тому що ви можете мати заяви, які, на вашу думку, виконують, але насправді це не так, і це не так очевидно, як якщо б у вас був блок if.
Петруза

6
Це називається оцінкою короткого замикання і корисно також для інших мов, крім PHP.
Містер Грівер

1
До речі, ви можете використовувати лише одне твердження після АБО. Оператор блоку не зможе перевірити синтаксис (наприклад, фактичне повідомлення про помилку могло бути помилкою Синтаксису: помилка синтаксису, несподівана '{' в ...)
Скотт Чу

І ось я був, думаючи, що це якась вдосконалена функція, як 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

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

11

Це працює так, як описали інші.

У PHP не використовуйте "die", оскільки це НЕ підвищує виняток (як це робиться в Perl). Замість цього киньте виняток належним чином у звичайний спосіб.

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.