Bagaimana cara kerja "melakukan sesuatu ATAU DIE ()" di PHP?

99

Saya sedang menulis aplikasi php untuk mengakses database MySQL, dan di tutorial, dikatakan sesuatu dari formulir

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

Bagaimana PHP mengetahui bahwa fungsinya gagal sehingga menjalankan bagian die? Saya kira saya bertanya bagaimana "atau" bagian itu bekerja. Saya tidak berpikir saya pernah melihatnya sebelumnya.

chustar
sumber
3
Sebagai tambahan, jangan gunakan logika semacam ini dalam aplikasi sebenarnya. Masih mengherankan saya berapa banyak tutorial yang melakukannya.
Eran Galperin
2
Mengapa tidak menggunakannya? Sangat bagus dan mudah dibaca ...
rkj
11
Mungkin sederhana dan sesuai untuk tutorial, tetapi Anda tidak ingin skrip Anda mati tanpa jejak dengan pesan kesalahan seperti itu di depan pengguna sebenarnya. Menampilkan halaman kesalahan khusus (tanpa menentukan kesalahan yang sebenarnya!) + Mencatat kesalahan adalah suatu keharusan.
Eran Galperin
4
Saya sedang berbicara tentang "atau", bukan "mati".
Artelius
21
mysql_connect ($ host, $ user, $ pass) atau PrintNiceError ('DatabsaeConnectionError');
matpie

Jawaban:

133

Jika pernyataan pertama kembali true, maka seluruh pernyataan harus trueoleh karena itu bagian kedua tidak pernah dijalankan.

Sebagai contoh:

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

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

Oleh karena itu, jika kueri Anda tidak berhasil, itu akan mengevaluasi die()pernyataan dan mengakhiri skrip.

nickf
sumber
1
Penjelasan yang bagus. Konstruksi bahasa "tersirat if" dari PHP ini sedikit berbahaya, karena Anda dapat memiliki pernyataan yang menurut Anda dieksekusi tetapi sebenarnya tidak, dan itu tidak sejelas jika Anda memiliki blok if.
Petruza
6
Ini disebut evaluasi sirkuit pendek dan berguna dalam bahasa selain PHP juga.
Tuan Griever
1
Omong-omong, Anda hanya dapat menggunakan satu pernyataan setelah ATAU. Pernyataan blok akan gagal dalam pemeriksaan sintaks (mis. Pesan kesalahan aktual bisa jadi kesalahan Parse: kesalahan sintaks, '{' in ...) tidak terduga
Scott Chu
Dan di sinilah saya, berpikir ini adalah semacam fitur lanjutan seperti withpernyataan python , padahal sebenarnya hanya ekspresi boolean ... Saya pikir perhatian ekstra harus dilakukan saat menggunakan ekspresi ini jika Anda diharapkan melakukan pembersihan jika terjadi kesalahan. Tolong, perbaiki saya jika saya salah, tetapi jika Anda melakukannya func_call($file) or die();dan fungsinya gagal, maka file dibiarkan terbuka ketika skrip mati.
pedromanoel
@Petruza Apakah itu praktik yang baik untuk digunakan ordalam situasi di mana ifbisa bekerja?
jeruk nipis
32

PHP orbekerja seperti C ||(yang notabene juga didukung oleh PHP - orhanya terlihat lebih bagus dan memiliki prioritas operator yang berbeda - lihat halaman ini ).

Ini dikenal sebagai operator hubung singkat karena akan melewatkan evaluasi apa pun setelah memiliki cukup informasi untuk menentukan nilai akhir.

Dalam contoh Anda, jika mysql_connect()mengembalikan TRUE, maka PHP sudah tahu bahwa seluruh pernyataan akan dievaluasi ke TRUE tidak peduli apa yang die()dievaluasi, dan karenanya die()tidak dievaluasi.

Jika mysql_connect()mengembalikan FALSE, PHP tidak tahu apakah seluruh pernyataan akan dievaluasi ke TRUE atau FALSE sehingga berlanjut dan mencoba untuk mengevaluasi die()- mengakhiri skrip dalam proses.

Itu hanya trik bagus yang memanfaatkan cara orkerjanya.

Artelius
sumber
1 untuk penamaan korsleting. Mungkin juga memiliki nama "efek samping". Kami sama sekali tidak tertarik dengan kode kembalian die (), kami hanya ingin efek dari eksekusinya. (Itu tidak selalu akan mati ()). Ini tidak selalu populer di kalangan kaum puritan karena beberapa efek bisa tidak jelas.
mckenzm
dan ini belum semuanya. Anda juga dapat menggunakan dan menggabungkan barang-barang, di mana Anda ingin hal itu pasti berfungsi sebelum melakukan hal kedua.
My1
11

Ini bekerja seperti yang dijelaskan orang lain.

Di PHP, jangan gunakan "die", karena TIDAK memunculkan pengecualian (seperti yang dilakukan di Perl). Sebaliknya, berikan pengecualian dengan benar dengan cara biasa.

die tidak dapat ditangkap dalam PHP, dan tidak mencatat - sebaliknya ia mencetak pesan dengan tidak benar dan segera menutup skrip tanpa memberi tahu siapa pun atau memberi Anda kesempatan untuk merekam acara, coba lagi, dll.

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