Jak „zrób coś LUB DIE ()” działa w PHP?

99

Piszę aplikację php, aby uzyskać dostęp do bazy danych MySQL, a w samouczku mówi coś o formularzu

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

Skąd PHP wie, że funkcja zawiodła, tak że uruchamia część matrycy? Myślę, że pytam, jak działa ta część „lub”. Chyba nie widziałem tego wcześniej.

chustar
źródło
3
Na marginesie, nie używaj tego rodzaju logiki w rzeczywistych aplikacjach. Wciąż zadziwia mnie, jak wiele tutoriali to robi.
Eran Galperin
2
Dlaczego tego nie używać? To jest naprawdę ładne i czytelne ...
rkj
11
To może być proste i odpowiednie dla samouczka, ale nie chcesz, aby Twój skrypt umarł bez gracji z takim komunikatem o błędzie przed prawdziwymi użytkownikami. Wyświetlanie niestandardowej strony błędu (bez określania rzeczywistego błędu!) + Rejestrowanie błędu jest koniecznością.
Eran Galperin
4
Mówię o „lub”, a nie „umrzeć”.
Artelius
21
mysql_connect ($ host, $ user, $ pass) lub PrintNiceError ('DatabsaeConnectionError');
matpie

Odpowiedzi:

133

Jeśli pierwsza instrukcja zwróci true, to cała instrukcja musi być, truedlatego druga część nigdy nie zostanie wykonana.

Na przykład:

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

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

Dlatego, jeśli zapytanie nie powiedzie się, oceni die()instrukcję i zakończy skrypt.

nickf
źródło
1
Dobre wytłumaczenie. Ta konstrukcja języka PHP „domniemana jeśli” jest trochę niebezpieczna, ponieważ możesz mieć instrukcje, które Twoim zdaniem są wykonywane, ale w rzeczywistości nie są, a to nie jest tak oczywiste, jak gdybyś miał blok if.
Petruza,
6
Nazywa się to oceną zwarć i jest przydatne również w językach innych niż PHP.
Mr Griever,
1
Nawiasem mówiąc, możesz użyć tylko jednej instrukcji po OR. Instrukcja blokowa nie przejdzie kontroli składni (np. Rzeczywisty komunikat o błędzie może być Błąd analizy: błąd składni, nieoczekiwany „{” w ...)
Scott Chu
I oto byłem, myśląc, że to jakaś zaawansowana funkcja, taka jak withinstrukcja Pythona , podczas gdy w rzeczywistości jest to tylko wyrażenie boolowskie ... Myślę, że należy zachować szczególną ostrożność podczas używania tego wyrażenia, jeśli oczekuje się, że wykonasz czyszczenie w przypadku błędy. Proszę, popraw mnie, jeśli się mylę, ale jeśli to zrobisz func_call($file) or die();i funkcja nie powiedzie się, plik zostanie otwarty, gdy skrypty umrą.
pedromanoel
@Petruza Czy jest to w ogóle dobra praktyka orw sytuacjach, w których ifmoże zadziałać?
limonka i kokos
32

PHP ordziała jak C ||(które, nawiasem mówiąc, jest również obsługiwane przez PHP - orpo prostu wygląda ładniej i ma inny priorytet operatorów - zobacz tę stronę ).

Jest znany jako operator zwarcia , ponieważ pominie wszelkie oceny, gdy będzie miał wystarczającą ilość informacji, aby zdecydować o ostatecznej wartości.

W twoim przykładzie, jeśli mysql_connect()zwraca TRUE, to PHP już wie, że cała instrukcja zostanie oceniona na TRUE, bez względu na to, die()do czego się zmienia, i dlatego die()nie jest oceniana.

Jeśli mysql_connect()zwraca FALSE, PHP nie wie, czy cała instrukcja oceni jako TRUE czy FALSE, więc kontynuuje i próbuje oszacować die()- kończąc skrypt w procesie.

To po prostu fajna sztuczka, która wykorzystuje sposób, w jaki ordziała.

Artelius
źródło
+1 za nazwanie zwarcia. Mógł również nazwać „efekt uboczny”. W ogóle nie interesuje nas kod powrotu funkcji die (), chcemy tylko efektu jego wykonania. (Nie zawsze będzie umrzeć ()). Nie zawsze jest to popularne wśród purystów, ponieważ niektóre efekty mogą być niejasne.
mckenzm,
a to nie wszystko. możesz także używać i łączyć różne rzeczy, jeśli chcesz, aby jedna rzecz zdecydowanie zadziałała, zanim zrobisz drugą.
Mój 1
11

Działa tak, jak opisali inni.

W PHP nie używaj „die”, ponieważ NIE zgłasza wyjątku (tak jak w Perlu). Zamiast tego wyrzuć wyjątek poprawnie w normalny sposób.

die nie może zostać przechwycony w PHP i nie rejestruje - zamiast tego drukuje wiadomość bez wdzięczności i natychmiast zamyka skrypt, nie mówiąc nikomu nic ani nie dając Ci możliwości zarejestrowania zdarzenia, ponownej próby itp.

MarkR
źródło
-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
Arun Kumar
źródło