Apa perbedaan die () dan exit () di PHP?

678

Apa perbedaan antara die()danexit() fungsi dalam PHP?

Saya pikir keduanya memiliki fungsi yang sama, tetapi saya ragu ada sesuatu yang berbeda di keduanya ... apa itu?

coderex
sumber
2
exit () hanya menebus program dengan status keluar numerik, sementara die () mencetak pesan kesalahan ke stderr dan keluar dengan status EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad

Jawaban:

541

Tidak ada perbedaan - mereka sama.

Manual PHP untuk exit:

Catatan: Konstruk bahasa ini setara dengan die().

Manual PHP untuk die:

Konstruk bahasa ini setara dengan exit().

Marek Karbarz
sumber
17
alias memungkinkan pemrogram untuk menggunakan program yang nyaman digunakan. Saya ingat keluar lebih baik daripada mati. Beberapa yang lain ingat mati lebih baik daripada keluar.
mauris
28
this ( php.net/manual/en/aliases.php ) mungkin memberikan beberapa penjelasan mengapa 2 fungsi melakukan hal yang sama
Marek Karbarz
87
Meskipun mereka melakukan hal yang sama, saya biasanya memesan dieuntuk berhenti terkait kesalahan dan exituntuk semua skenario lainnya. Sepertinya mengalir lebih baik saat membaca kode.
nextgentech
7
Maaf untuk menghidupkan kembali ini, tetapi setidaknya bagi saya ... diejauh lebih cepat untuk menulis daripada exit... Saya mulai menggunakan exitkarena lebih mudah dibaca oleh programmer non-PHP, tetapi diehanya lebih cepat untuk mengetik ketika Anda berada di cepat. Juga, omong-omong saya mengetik, saya tidak perlu mengubah posisi tangan untuk menulis die.
Alejandro Iván
7
@ Mauris, Jauh lebih baik jika satu fungsi hanya memiliki satu nama . Bayangkan setiap fungsi PHP memiliki dua nama, yang akan menjadi berantakan .
Pacerier
222

PERBEDAAN DALAM ASAL

Perbedaan antara die()dan exit()dalam PHP adalah asalnya .


SETIAP FUNGSIONAL

die()dan exit()merupakan fungsi yang setara.

Manual PHP

Manual PHP untuk die:

Konstruk bahasa ini setara dengan exit().

Manual PHP untuk exit:

Catatan: Konstruk bahasa ini setara dengan die().

Manual PHP untuk Daftar Alias ​​Fungsi :

die adalah alias untuk fungsi master exit()


BERBEDA DALAM BAHASA LAIN

die() dan exit() yang berbeda dalam bahasa lain tetapi dalam PHP mereka identik.

Dari kata-kata kasar lain PHP :

... Sebagai pembuat kode C dan Perl, saya siap menjawab, "Mengapa, keluar () hanya menebus program dengan status keluar numerik, sementara die () mencetak pesan kesalahan ke stderr dan keluar dengan status EXIT_FAILURE. " Tapi kemudian saya ingat kita berada di tanah sintaksis PHP.

Di PHP, exit () dan die () identik.

Para desainer jelas berpikir "Hmm, mari kita meminjam exit () dari C. Dan orang-orang Perl mungkin akan menyukainya jika kita mengambil die () seperti dari Perl . Ups! Kami memiliki dua fungsi keluar sekarang! Mari kita buat sehingga mereka berdua dapat mengambil string atau integer sebagai argumen dan membuatnya identik! "

Hasil akhirnya adalah bahwa ini tidak benar-benar membuat segalanya "lebih mudah", hanya lebih membingungkan. C dan Perl coders akan terus menggunakan exit () untuk melemparkan nilai keluar integer saja, dan mati () untuk melemparkan pesan kesalahan dan keluar dengan kegagalan. Pemula dan orang-orang yang menggunakan PHP sebagai bahasa pertama mungkin akan bertanya-tanya "umm, dua fungsi keluar, yang mana yang harus saya gunakan?" Manual tidak menjelaskan mengapa ada exit () dan die ().

Secara umum, PHP memiliki banyak redundansi aneh seperti ini - ia mencoba bersikap ramah kepada orang-orang yang berasal dari latar belakang bahasa yang berbeda, tetapi saat melakukannya, itu menciptakan redundansi yang membingungkan.

Geoffrey Hale
sumber
14
Meskipun ini adalah tentang jawaban ke-100 yang menyatakan bahwa mereka setara (seperti juga terlihat dalam jawaban saya ^^), ini benar-benar menambahkan beberapa poin SANGAT bagus. Kebanyakan dari semua itu BUKAN sama dalam bahasa lain (sehingga kebingungan di tempat pertama). (+1)
Levite
@Levit, Tidak, tidak, Anda salah total . Tidak ada yang memiliki nama dan bahasa yang berbeda menggunakan kembali nama yang sama dengan cara yang tidak ada salahnya. Tidak apa-apa karena kita tidak memerlukan cara standar lain dalam melakukan sesuatu. "Kebingungan di tempat pertama" adalah karena PHP menetapkan dua nama yang berbeda untuk satu fungsi ..
Pacerier
2
@Pacerier: Tentu, jika Anda melihatnya dari sudut "siapa yang salah itu", itu benar sekali. Masih juga fakta bahwa mereka hanya berarti hal yang berbeda dalam beberapa bahasa (yang tidak masalah). Melihatnya dari perspektif netral, itu pasti benar: Ada kebingungan karena perbedaan makna (bahkan jika itu adalah kesalahan php untuk membuat dua alias fungsi yang sama). Saya pasti tidak ingin menunjukkan satu pun dari bahasa-bahasa itu, jika itu yang Anda mengerti dari komentar saya ... (xkcd btw (Y) ^^)
Levite
2
Ini pasti jawaban yang dipilih, deskripsi yang bagus!
Cody Brown
Pengguna lain menjawab bahwa exit()tidak menutup koneksi sementara die(), tampaknya relevan.
ner0
62

Seperti yang dinyatakan sebelumnya, kedua perintah ini menghasilkan token parser yang sama.

TAPI

Ada perbedaan kecil, dan itu adalah berapa lama parser untuk mengembalikan token.

Saya belum mempelajari parser PHP, tetapi jika itu adalah daftar panjang fungsi yang dimulai dengan "d", dan daftar yang lebih pendek dimulai dengan "e", maka harus ada penalti waktu mencari nama fungsi untuk fungsi yang dimulai dengan " e ". Dan mungkin ada perbedaan lain karena cara seluruh nama fungsi diperiksa.

Saya ragu itu akan terukur kecuali Anda memiliki lingkungan "sempurna" yang didedikasikan untuk parsing PHP, dan banyak permintaan dengan parameter berbeda. Tetapi harus ada perbedaan, lagipula, PHP adalah bahasa yang diartikan.

Bob
sumber
4
@Timeless, Perfeksionis tidak akan mengatakan "PHP adalah bahasa yang ditafsirkan". PHP adalah bahasa yang bisa ditafsirkan atau dikompilasi tergantung pada pengaturan server Anda.
Pacerier
29
Dan ... "die" panjangnya 3 karakter vs 4 untuk "keluar". Jadi dibutuhkan 25% lebih sedikit memori dan ruang file! ;)
Jan Derk
2
'"jika daftar panjang fungsi dimulai dengan" d ", dan daftar pendek dimulai dengan" e ", maka harus ada penalti waktu mencari nama fungsi untuk fungsi yang dimulai dengan" e "'. berarti bahwa penalti waktu akan terjadi ketika mencari fungsi dimulai dengan d ? Biasanya, semakin besar daftar, semakin lama waktu untuk menemukan item di dalamnya
Pere
9
Saat Anda menulis, Anda belum mempelajari parser PHP. Terima kasih atas jawaban yang tidak berguna ini karena didasarkan pada impian Anda tentang bagaimana PHP diimplementasikan.
dolmen
44

Manual PHP pada die :

die - Setara dengan keluar

Anda bahkan dapat melakukan die;dengan cara yang sama sepertiexit; - dengan atau tanpa parens.

Satu-satunya keuntungan memilih die()lebih dari itu exit(), mungkin waktu Anda luang mengetik surat tambahan ;-)

Orang Lewi
sumber
1
itu juga membuat nyaman ketika seseorang datang dari bahasa lain, apakah mereka mendapatkan keakraban dalam salah satu cara
Rohan Khude
Catatan bahwa jika menjalankan php interaktif ( php -a) die;, die();, exit;dan exit();tidak memiliki efek, sementara exit(tanpa titik koma) keluar modus interaktif.
santiago arizti
31

Seperti semua jawaban benar lainnya mengatakan, diedan exitidentik / alias.

Meskipun saya memiliki konvensi pribadi bahwa ketika saya ingin mengakhiri eksekusi skrip ketika diharapkan dan diinginkan, saya menggunakan exit;. Dan ketika saya harus mengakhiri eksekusi karena beberapa masalah (tidak dapat terhubung ke db, tidak dapat menulis ke file dll.), Saya menggunakandie("Something went wrong."); untuk "membunuh" skrip.

Ketika saya menggunakan keluar:

header( "Location: http://www.example.com/" ); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit; // I would like to end now.

Saat saya menggunakan die:

$data = file_get_contents( "file.txt" );
if( $data === false ) {
    die( "Failure." ); // I don't want to end, but I can't continue. Die, script! Die!
}
do_something_important( $data );

Dengan cara ini, ketika saya melihat exitpada suatu titik dalam kode saya, saya tahu bahwa pada titik ini saya ingin keluar karena logika berakhir di sini. Ketika saya melihat die, saya tahu bahwa saya ingin melanjutkan eksekusi, tetapi saya tidak bisa atau tidak seharusnya karena kesalahan dalam eksekusi sebelumnya.

Tentu saja ini hanya berfungsi ketika mengerjakan proyek sendiri. Ketika ada lebih banyak orang, tidak ada yang akan mencegah mereka untuk menggunakan dieatau di exitmana tidak sesuai dengan konvensi saya ...

Lukas
sumber
30

Ini sesuatu yang cukup menarik. Meskipun exit()dan die()setara, die() menutup koneksi. exit() tidak menutup koneksi.

die():

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

exit():

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

Hasil:

exit():

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

die():

HTTP/1.1 304 Not Modified 
Connection: close

Hanya memetikan perlu mempertimbangkan ini untuk proyek Anda.

Kredit: https://stackoverflow.com/a/20932511/4357238

Edward
sumber
1
Ini harus menjadi jawaban yang diterima.
ner0
2
Hanya mengujinya dan exitdan diebekerja dengan cara yang sama, keduanya menutup koneksi.
Grzegorz Adam Kowalski
12

Secara fungsional, keduanya identik tetapi saya menggunakannya dalam skenario berikut untuk membuat kode dapat dibaca:

Gunakan die () ketika ada kesalahan dan harus menghentikan eksekusi.

misalnya die( 'Oops! Something went wrong' );

Gunakan exit () ketika tidak ada kesalahan dan harus menghentikan eksekusi.

misalnya exit( 'Request has been processed successfully!' );

aagjalpankaj
sumber
11

Halaman ini mengatakan dieadalah teman exit, jadi mereka identik. Tetapi juga menjelaskan bahwa:

ada fungsi yang mengubah nama karena pembersihan API atau alasan lain dan nama lama hanya disimpan sebagai alias untuk kompatibilitas mundur. Biasanya merupakan ide yang buruk untuk menggunakan alias semacam ini, karena mereka mungkin terikat dengan keusangan atau penggantian nama, yang akan mengarah pada skrip yang tidak dapat dipercaya.

Jadi, panggil aku paranoid, tapi mungkin tidak ada diedi masa depan.

Pedram Behroozi
sumber
3
Ia juga mengatakan Dalam beberapa kasus tidak ada nama yang disukai di antara banyak yang, is_int()dan is_integer()sama-sama bagus misalnya. Melihat php-srcsejarah commit pada GitHub, die()konstruknya telah ada di PHP setidaknya sejak 1999 ketika dikonversi menjadi repositori SVN, dan mungkin selama bahasa tersebut ada. Tampaknya tidak masuk akal membayangkan bahwa itu akan pernah ditinggalkan.
Mark Amery
2
@MarkAmery, Meskipun premisnya tidak mengarah pada kesimpulannya, kesimpulan itu sendiri valid: ~ "Panggil saya paranoid, tetapi mungkin tidak ada exitdi masa depan. Atau mungkin tidak ada diedi masa depan"
Pacerier
@Pacerier Benar sekali. Mungkin tidak ada PHP di masa depan, jadi mari kita semua berhenti dari pertunjukan program ini dan menjadi pengurus pajak atau penagih pajak. Tidak ada yang pasti selain kematian dan pajak.
Mark Amery
@MarkAmery, "Tidak ada PHP di masa depan" tampaknya lebih dari rata-rata paranoid. Sejarah telah menunjukkan bahwa bahasa-bahasa populer yang gila tidak mudah mati (Fortran!).
Pacerier
1
Jangan paranoid. keluar tidak akan pernah mati . :)
dolmen
6

Mereka pada dasarnya sama, meskipun artikel ini menyarankan sebaliknya.

baik w
sumber
1
Artikel itu aneh; dari definisi pemindai Anda dapat mengatakan bahwa mereka setara; jika ada perbedaan, mungkin tes dijalankan tanpa opcache.
Ja͢ck
Artikel ini tentang patokan yang tidak dapat direproduksi karena kode tidak dipublikasikan. Abaikan saja.
dolmen
0

Secara fungsional, mereka identik. Jadi untuk memilih mana yang akan digunakan benar-benar pilihan pribadi. Secara semantik dalam bahasa Inggris, mereka berbeda. Mati terdengar negatif. Ketika saya memiliki fungsi yang mengembalikan data JSON ke klien dan menghentikan program, itu bisa mengerikan jika saya memanggil fungsi ini jsonDie (), dan lebih tepat untuk menyebutnya jsonExit (). Untuk alasan itu, saya selalu menggunakan jalan keluar daripada mati.

Luo Jiong Hui
sumber
OP hanya bertanya tentang fungsi keluar dan mati PHP saja.
Black Mamba
1
Ya, dan saya hanya menjawab pertanyaan itu. Namun untuk disadari, pertanyaannya bukan tentang perbedaan fungsi saja.
Luo Jiong Hui
Salah satu fungsi saya yang paling indah disebut pd () - Yang berarti Harap Mati. Jadi saya tidak yakin bahwa mati adalah hal yang buruk dalam konteks seperti itu :)
Ivan Ponomarev
Sebagai pengembang tumpukan penuh, saya tidak hanya melihat diri saya sebagai seorang programmer, tetapi juga seorang desainer Pengalaman Pengguna. Dan dalam konteks ini, simpati itu penting. Simpati tidak hanya memengaruhi cara saya mendesain UI, tetapi juga cara saya membuat kode.
Luo Jiong Hui
0

Dari apa yang saya tahu ketika saya melihat pertanyaan ini di sini

Dikatakan di sana bahwa "dalam PHP, ada perbedaan yang berbeda dalam output Header. Dalam contoh di bawah ini saya memilih untuk menggunakan header yang berbeda tetapi demi menunjukkan perbedaan antara exit () dan die () itu tidak masalah", dan diuji (secara pribadi)

Dhiva Banyu Wigara
sumber
-3

Dalam w3schools Quiz: Fungsi die () dan exit () melakukan hal yang persis sama? jawaban saya salah. Itu jawaban yang salah. Jawaban yang benar itu benar.

Berikut screenshotnya: masukkan deskripsi gambar di sini

li bing zhao
sumber
-5

Sesuatu yang saya perhatikan dalam skrip saya setidaknya adalah bahwa exit () akan menghentikan skrip yang sedang dieksekusi dan memberikan kontrol kembali ke skrip panggilan apa pun, sementara die akan menghentikan php di jalurnya. Saya akan mengatakan itu perbedaan yang cukup besar?

noowie
sumber
1
@ AdarshMadrecha ini tidak benar. Jika ada di dalam atau di luar subfungsi, skrip php selalu berhenti.
MERT DOĞAN
-5

Hasil dari fungsi exit () dan fungsi die () sama saja. Tetapi seperti yang dijelaskan dalam halaman manual alias ( http://php.net/manual/en/aliases.php ), dikatakan bahwa fungsi die () memanggil fungsi keluar. Saya pikir ini kode sulit seperti di bawah ini:

function die($msg){
  exit($msg);
}

Ini bukan masalah kinerja untuk proyek-proyek kecil, menengah dan besar, tetapi jika proyek memiliki miliaran, miliaran, miliaran, proses miliaran, ini terjadi keadaan optimisasi kinerja yang sangat penting.

Tetapi sebagian besar orang tidak berpikir ini adalah masalah, karena jika Anda memiliki banyak proses, Anda harus memikirkan lebih banyak masalah daripada jika suatu fungsi adalah master atau alias.

Tetapi, jawaban pasti adalah itu; fungsi allways master lebih cepat dari alias.

Akhirnya; Halaman manual Alias mengatakan bahwa, Anda tidak lagi menggunakan die. Ini hanya alias, dan sudah usang.

Biasanya merupakan ide yang buruk untuk menggunakan alias semacam ini, karena mereka mungkin terikat dengan keusangan atau penggantian nama, yang akan mengarah pada skrip yang tidak dapat dipercaya. Daftar ini disediakan untuk membantu mereka yang ingin memutakhirkan skrip lama ke sintaks yang lebih baru.

MERT DOĞAN
sumber
2
Mengasingkan tidak 'memanggil fungsi'. Periksa asumsi Anda sebelum menguraikan hipotesis.
dolmen
@dolmen Alias ​​allways memanggil fungsi utama dalam kode keras. Ini adalah aturan pemrograman umum.
MERT DOĞAN
@ MERTDOĞAN alias tidak memanggil apa-apa. Alias ​​(dalam pemrograman atau dalam kehidupan nyata) hanyalah nama lain dari suatu objek (yang sudah memiliki nama). die()bukan fungsi yang terpisah. Itu hanya nama lain dari exit(). Jawaban ini berisi pernyataan yang salah tentang alias dan kinerjanya.
axiac
docs.php.net/manual/en/… Alases allways calles seperti contoh di atas. Pelajari sesuatu dan kembali.
MERT DOĞAN
-10

Kedengarannya sama, namun, exit () juga memungkinkan Anda untuk mengatur kode keluar skrip PHP Anda.

Biasanya Anda tidak benar-benar membutuhkan ini, tetapi ketika menulis skrip PHP konsol, Anda mungkin ingin memeriksa misalnya Bash jika skrip menyelesaikan semuanya dengan cara yang benar.

Kemudian Anda dapat menggunakan exit () dan menangkapnya nanti. Die () Namun tidak mendukung itu.

Die () selalu ada dengan kode 0. Jadi pada dasarnya perintah die () melakukan hal berikut:

<?php
echo "I am going to die";
exit(0);
?>

Yang sama dengan:

<?php
die("I am going to die");
?>
Icheb
sumber
42
Itu tidak benar. diedan exitidentik (mereka menghasilkan token parser yang sama ( T_EXIT) dan dieksekusi oleh kode yang sama). Jika parameter bilangan bulat, itu akan mengembalikan kode itu ke shell. Jika tidak, itu akan menampilkannya dan mengembalikan 0. Jadi diedan exitsecara harfiah alias satu sama lain.
ircmaxell
6
baik jika Anda tahu Anda bisa menggunakan keluar ("Saya keluar ...");
Yuda Prawira
4
Sejauh ini 23 jawaban positif untuk jawaban yang benar-benar salah! Inilah sebabnya saya tidak pernah memilih jawaban sampai saya sudah membaca semua jawaban yang bersaing untuk pertanyaan itu dan mengerti semuanya (kecuali yang ditulis dengan sangat buruk yang tidak bisa saya pahami).
Mark Amery
3
Inilah yang ditulis @GeoffreyHale dalam jawabannya. Apa yang Anda posting sebagai jawaban adalah apa yang diharapkan seseorang, berasal dari bahasa seperti Perl atau C. Tapi seperti yang disebutkan lainnya itu tidak benar untuk php. Anda mungkin benar-benar mempertimbangkan untuk mengedit jawaban Anda untuk mencerminkan ini, atau menghapusnya.
Levite