PHP'de die () ve exit () arasındaki farklar nelerdir?


679

PHP arasındaki die()ve exit()fonksiyonları arasındaki farklar nelerdir ?

Her ikisinin de aynı işlevselliğe sahip olduğunu düşünüyorum, ama her ikisinde de farklı bir şey olduğundan şüpheliyim ... nedir?


2
exit () yalnızca sayısal çıkış durumuyla programı kapatır; die () ise stderr hata iletisini yazdırır ve EXIT_FAILURE durumuyla çıkar. so exit() is exit and die() is also exit :)
Muhammed Şahzad

Yanıtlar:


541

Fark yok - onlar aynı.

PHP Kılavuzu exit:

Not: Bu dil yapısı eşdeğerdir die().

PHP Kılavuzu die:

Bu dil yapısı eşittir exit().


17
takma adlar programcıların rahat olanı kullanmasını sağlar. Çıkıştan ölmekten daha iyi hatırlıyorum. Bazıları öldüğünden daha iyi öldüğünü hatırlar.
mauris

28
this ( php.net/manual/tr/aliases.php ) 2 fonksiyonun neden aynı şeyi yaptığını açıklayabilir
Marek Karbarz

87
Aynı şeyi yapsalar da, genellikle diehata ile ilgili duraklar ve exitdiğer tüm senaryolar için ayrılırım. Kodu okurken daha iyi akıyor gibi görünüyor.
nextgentech

7
Bunu canlandırmak için üzgünüm, ama en azından benim için ... dieyazmaktan çok daha hızlı exit... exitPHP-programcı olmayanlar için daha okunabilir olduğu için kullanmaya başladım , ancak dieyazarken daha hızlı acele. Ayrıca, yazarken, yazmak için ellerimin pozisyonunu değiştirmek zorunda değilim die.
Alejandro Iván

7
@mauris, Bir fonksiyonun sadece bir isme sahip olması çok daha iyi . Her PHP işlevinin iki adı olduğunu düşünün, bu tam bir karmaşa olacaktır .
Pacerier

222

KÖKENDE FARK

Arasındaki fark die()ve exit()PHP onların olduğu kökenli .


FONKSİYONEL EŞDEĞER

die()ve exit()olan eşdeğer fonksiyonlar.

PHP Kılavuzu

PHP Kılavuzu die:

Bu dil yapısı eşittir exit().

PHP Kılavuzu exit:

Not: Bu dil yapısı eşdeğerdir die().

İşlev Takma Adları Listesi için PHP Kılavuzu :

die ana işlev için bir takma addır exit()


DİĞER DİLLERDE FARKLI

die()ve exit()olan diğer dillerde farklı ancak PHP onlar aynıdır.

Gönderen Henüz başka bir PHP rant :

... Bir C ve Perl kodlayıcı olarak, "Neden, exit () sayısal bir çıkış durumuyla programı kapatır, die () ise stderr hata mesajını yazdırır ve EXIT_FAILURE durumuyla çıkar. " Ama sonra PHP'nin dağınık sözdizimi ülkesinde olduğumuzu hatırladım.

PHP'de exit () ve die () aynıdır.

Tasarımcılar açıkça "Hmm, C'den çıkış () ödünç alalım . Ve Perl millet muhtemelen Perl'den olduğu gibi die () alırsak hoşuna gidecek . Hata! Şimdi iki çıkış fonksiyonumuz var! bir dize veya tamsayıyı argüman olarak alıp özdeş yapabilir! "

Sonuç, bunun işleri gerçekten "daha kolay" ve daha kafa karıştırıcı hale getirmediğidir. C ve Perl kodlayıcıları yalnızca bir tamsayı çıkış değeri atmak için exit () öğesini kullanmaya devam eder ve bir hata mesajını atmak ve bir hata ile çıkmak için die () yöntemini kullanmaya devam eder. Yeni başlayanlar ve ilk dil olarak PHP insanlar muhtemelen "umm, iki çıkış fonksiyonu, hangisini kullanmalıyım?" Kılavuz, exit () ve die () öğelerinin neden olduğunu açıklamaz.

Genel olarak, PHP'nin bunun gibi garip bir fazlalığı vardır - farklı dil geçmişlerinden gelen insanlara dost olmaya çalışır, ancak bunu yaparken kafa karıştırıcı fazlalık yaratır.


14
Bu, eşdeğer olduklarını belirten 100. cevap hakkında olsa da (cevabımda ^^ da görüldüğü gibi), bu gerçekten çok iyi bazı noktalar ekler. Hepsinin çoğu diğer dillerde aynı DEĞİLDİR (bu nedenle ilk başta karışıklık). (+1)
Levite

@Levit, Hayır, hayır, tamamen yanlış anlıyorsun . Kimse isimlere sahip değildir ve farklı diller aynı isimleri aynı şekilde kullanmaz. Bu iyi çünkü bir şeyler yapmak için başka bir standart yola ihtiyacımız yok . "İlk etapta karışıklık" PHP bir işleve iki farklı ad atama nedeniyle ..
Pacerier

2
@Pacerier: Elbette, ona "kimin suçu" olduğu noktadan bakarsanız, bu kesinlikle doğrudur. Yine de, birçok dilde (ki tamam) farklı şeyler ifade ettikleri de bir gerçektir. Nötr bir perspektiften bakıldığında, kesinlikle doğrudur: Farklı anlamlar nedeniyle karışıklık vardır (php'nin iki eşit işlev takma adı oluşturma hatası olsa bile). Kesinlikle bu dillerden herhangi birisine işaret etmek istemedim, eğer benim yorumumdan anladığınız buysa ... (büyük xkcd btw (Y) ^^)
Levite

2
Bu kesinlikle seçilen cevap olmalı, iyi açıklama!
Cody Brown

exit()Bağlantıyı kapatmazken yanıtlayan başka bir kullanıcı die()alakalı görünüyor.
ner0

62

Daha önce belirtildiği gibi, bu iki komut aynı ayrıştırıcı belirtecini üretir.

FAKAT

Küçük bir fark vardır ve ayrıştırıcının jetonu iade etmesi ne kadar zaman alır.

Ben PHP ayrıştırıcı çalışmadım, ama eğer "d" ile başlayan fonksiyonların uzun bir listesi ve "e" ile başlayan daha kısa bir liste, o zaman " e". Tüm işlev adının nasıl denetlendiğinden dolayı başka farklılıklar olabilir.

PHP ayrıştırma adanmış "mükemmel" bir ortam ve farklı parametreleri ile istekleri bir sürü sürece ölçülebilir olacak şüpheliyim. Ama bir fark olmalı, sonuçta PHP yorumlanmış bir dildir.


4
@Zamansız, Mükemmeliyetçiler "PHP yorumlanmış bir dildir" demezler. PHP, sunucu kurulumunuza bağlı olarak yorumlanabilen veya derlenebilen bir dildir.
Pacerier

29
Ve ... "die" 3 karakter uzunluğunda ve "exit" için 4'tür. Yani% 25 daha az bellek ve dosya alanı gerektirir! ;)
Jan Derk

2
"", "d" ile başlayan uzun bir işlev listesi ve "e" ile başlayan daha kısa bir liste ise, "e" ile başlayan işlevler için işlev adını ararken zaman cezası verilmelidir. ile başlayan fonksiyonunu ararken zaman cezası bunun olacağını ortalama d ? Genellikle liste daha büyük, daha uzun zaman içinde bir öğe bulmak için.
Pere

9
Yazdığınız gibi, PHP ayrıştırıcısını incelemediniz. PHP'nin nasıl uygulandığına dair hayallerinize dayandığı için bu işe yaramaz cevap için teşekkürler.
dolmen

44

Kalıpta PHP kılavuzu :

die - Çıkmaya eşdeğer

Hatta yapabilirsiniz die;aynı şekilde exit;- ya Pars olmadan.

Seçmenin tek avantajı die()üzerinde exit(), fazladan bir mektup yazarak üzerinde yedek zaman olabilir ;-)


1
Birisi başka bir dilden geldiğinde de kolaylık
sağladı

Not ki (etkileşimli php çalıştıran eğer php -a) die;, die();, exit;ve exit();ise hiçbir etkisi yoktur exit(noktalı virgül olmadan) interaktif modundan çıkar.
santiago arizti

31

Diğer tüm doğru cevapların söylediği gibi dieve exitaynı / takma adlardır.

Her ne kadar bir senaryoyu beklenen ve istendiğinde yürütmeyi sonlandırmak istediğimde kullanacağım kişisel bir kuralım olmasına rağmen exit;. Ve bazı sorunlar nedeniyle yürütmeyi sonlandırmam gerektiğinde (db'ye bağlanamadım, dosyaya yazamadım vb.), die("Something went wrong.");Komut dosyasını "öldürmek" için kullanıyorum.

Çıkışı kullandığımda:

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.

Die kullandığımda:

$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 );

Bu şekilde, kodumun bir exitnoktasında gördüğümde, bu noktada mantık burada bittiği için çıkmak istediğimi biliyorum. Gördüğümde die, yürütmeye devam etmek istediğimi biliyorum, ancak önceki yürütmedeki hata nedeniyle yapamam veya yapmamam gerekiyor.

Tabii ki bu sadece bir proje üzerinde çalışırken işe yarar. Daha fazla insan olduğunda kimse onların kullanmasını dieveya exitsözleşmelerime uymadığını engelleyemez ...


30

İşte oldukça ilginç bir şey. exit()Ve die()eşdeğer olmasına rağmen bağlantıyı die() kapatır . bağlantıyı exit() kapatmaz .

die():

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

exit():

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

Sonuçlar:

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

Sadece bunu projeniz için dikkate almanız gerekiyorsa.

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


1
Bu kabul edilen cevap olmalı.
ner0

2
Sadece test exitve dieher ikisi de yakın bağlantısı, aynı şekilde çalışır.
Grzegorz Adam Kowalski

12

İşlevsellik açısından aynıdır, ancak kodları okunabilir yapmak için aşağıdaki senaryolarda kullanırım:

Bir hata olduğunda die () kullanın ve yürütmeyi durdurun.

Örneğin die( 'Oops! Something went wrong' );

Bir hata olmadığında ve yürütmeyi durdurmanız gerektiğinde exit () öğesini kullanın.

Örneğin exit( 'Request has been processed successfully!' );


11

Bu sayfa diyor ki die, exitonlar aynı. Ancak şunu da açıklar:

API temizleme veya başka bir nedenden dolayı adları değiştiren işlevler vardır ve eski adlar yalnızca geriye dönük uyumluluk için takma ad olarak tutulur. Genellikle bu tür takma adların kullanılması, eskime veya yeniden adlandırmaya bağlı olabileceğinden, taşınabilir yazıya yol açacaktır.

Bu yüzden bana paranoyak deyin, ama diegelecekte hiç bir şey olmayabilir .


3
Aynı zamanda, bazı durumlarda, çoklu olanlar arasında tercih edilen bir isim olmadığını is_int()ve is_integer()örneğin eşit derecede iyi olduğunu söylüyor . php-srcGitHub'daki taahhüt geçmişine bakıldığında , die()yapı en azından 1999'dan beri bir SVN deposuna dönüştürüldüğünde ve muhtemelen dil var olduğu sürece PHP'dedir. Kullanımdan kaldırılacağını hayal etmek saçma görünüyor.
Mark Amery

2
@MarkAmery, Mekanları sonucuna yol açmasa da, sonucun kendisi geçerlidir: ~ "Bana paranoyakexitdie
deyin

@Pacerier Oldukça doğru. Gelecekte PHP olmayabilir, bu yüzden bu programlama işinden çıkalım ve üstleniciler veya vergi tahsildarları olalım. Sonuçta ölüm ve vergilerden başka hiçbir şey kesin değil.
Mark Amery

@MarkAmery, "Gelecekte PHP yok" ortalamanın üzerinde paranoyak gibi görünüyor. Tarih, delice popüler dillerin bu kadar kolay ölmediğini göstermiştir (Fortran!).
Pacerier

1
Paranoyak olma. çıkış asla ölmeyecek . :)
dolmen


6

Bu makale aksini öne sürmesine rağmen, aslında aynıdırlar.


1
Bu makale sadece garip; dan tarayıcı tanımı onlar eşdeğerdir söyleyebilir; herhangi bir fark varsa, belki de bir opcache olmadan test yapıldı.
Ja͢ck

Makale, kod yayınlanmadığı için çoğaltılamayan bir kıyaslama ile ilgilidir. Görmezden gel.
dolmen

0

İşlevsel olarak aynıdırlar. Yani hangisini kullanacağınızı seçmek tamamen kişisel bir tercihtir. Anlamsal olarak İngilizce, farklılar. Die kulağa olumsuz geliyor. JSON verilerini istemciye döndüren ve programı sonlandıran bir işlevim olduğunda, bu işlevi jsonDie () çağırırsam ve jsonExit () olarak adlandırmak daha uygun olabilir. Bu nedenle daima kalıp yerine çıkış kullanıyorum.


OP sadece PHP çıkış ve kalıp fonksiyonlarını soruyor.
Black Mamba

1
Evet ve ben sadece bu soruyu cevaplıyordum. Ancak, farkında olmak gerekirse, soru sadece işlevsellikteki fark ile ilgili değildir.
Luo Jiong Hui

Benim en güzel işlevlerimden biri pd () olarak adlandırılıyor. Bu yüzden ölmenin böyle bir bağlamda kötü bir şey olduğundan emin değilim :)
Ivan Ponomarev

Tam bir yığın geliştirici olarak kendimi sadece bir programcı olarak değil, aynı zamanda bir Kullanıcı Deneyimi tasarımcısı olarak görüyorum. Ve bu bağlamda, sempati önemlidir. Sempati sadece kullanıcı arayüzünü nasıl tasarladığımı değil, aynı zamanda nasıl kodladığımı da etkiler.
Luo Jiong Hui

0

Bu soru baktığımda ne bildiklerini itibaren burada

"PHP'de Header çıktısında belirgin bir fark var. Aşağıdaki örneklerde farklı bir header kullanmayı seçtim ama exit () ve die () arasındaki farkı göstermek adına" ve test edildi (kişisel olarak)


-3

W3schools Quiz: die () ve exit () işlevleri aynı şeyi yapar? cevabım yanlış. Bu yanlış cevap. Doğru cevap doğrudur.

İşte ekran görüntüsü: resim açıklamasını buraya girin


-5

Komutlarımda en azından fark ettiğim bir şey, exit () şu anda yürütülen komut dosyasını durduracak ve herhangi bir çağıran komut dosyasına geri geçecekken, die parçalarında php'yi durduracak. Bunun oldukça büyük bir fark olduğunu söyleyebilirim?


1
@AdarshMadrecha bu doğru değil. Bir alt işlevin içinde veya dışındaysa, php betiği her zaman durur.
MERT DOĞAN

-5

Exit () işlevi ve die () işlevinin sonucu her zaman aynıdır. Ancak diğer ad manuel sayfasında ( http://php.net/manual/en/aliases.php ) açıklandığı gibi , die () işlevinin çıkış işlevini çağırdığını söylüyor. Ben aşağıdaki gibi kodlanmış sert olduğunu düşünüyorum:

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

Bu, küçük, orta ve büyük projeler için bir performans sorunu değildir, ancak projenin milyarlarca çarpımı milyarlarca çarpımı milyarlarca süreç varsa, bu çok önemli bir performans optimizasyon durumu olur.

Ancak çoğu insan bunun bir sorun olduğunu düşünmez, çünkü bu kadar çok işleminiz varsa, bir fonksiyonun ana veya takma addan daha fazla sorun düşünmeniz gerekir.

Ancak, kesin cevap şudur; allways master işlevi takma addan daha hızlıdır.

En sonunda; Takma ad kılavuz sayfası , artık kalıp kullanamayacağınızı söylüyor. Bu sadece bir takma addır ve kullanımdan kaldırılmıştır.

Genellikle bu tür takma adların kullanılması, eskime veya yeniden adlandırmaya bağlı olabileceğinden, taşınabilir yazıya yol açacaktır. Bu liste, eski komut dosyalarını yeni sözdizimine yükseltmek isteyenlere yardımcı olmak için sağlanmıştır.


2
Takma ad 'bir işlevi çağırmak' değildir. Hipotezi detaylandırmadan önce varsayımlarınızı kontrol edin.
dolmen

@dolmen Takma adlar her zaman sabit kodlarda ana işlevleri çağırır. Bu genel bir programlama kuralıdır.
MERT DOĞAN

@ MERTDOĞAN Takma ad hiçbir şey çağırmaz. Bir takma ad (programlamada veya gerçek hayatta) bir nesnenin (zaten bir adı olan) başka bir adıdır. die()ayrı bir işlev değildir. Bu sadece başka bir isim exit(). Bu yanıt takma adlar ve performansları hakkında yanlış ifadeler içeriyor.
axiac

docs.php.net/manual/tr/… Yukarıdaki örnekte olduğu gibi her zaman arayanları diğer adlar. Bir şeyler öğren ve geri dön.
MERT DOĞAN

-10

Aynı ses çıkarırlar, ancak exit () ayrıca PHP betiğinizin çıkış kodunu ayarlamanızı sağlar.

Genellikle buna gerçekten ihtiyacınız yoktur, ancak konsol PHP komut dosyaları yazarken, komut dosyasının her şeyi doğru şekilde tamamlayıp doldurmadığını örneğin Bash ile kontrol etmek isteyebilirsiniz.

Ardından exit () öğesini kullanabilir ve daha sonra yakalayabilirsiniz. Ancak Die () bunu desteklemiyor.

Die () her zaman 0 kodunda bulunur. Bu nedenle, esas olarak bir die () komutu aşağıdakileri yapar:

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

Hangisi ile aynı:

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

42
Bu doğru değil. dieve exitaynıdır (aynı ayrıştırıcı jetonunu ( T_EXIT) üretir ve aynı kod tarafından yürütülür). Parametre bir tamsayı ise, bu kodu kabuğa döndürür. Değilse, bu çıkış o olacak ve 0. So dönmek dieve exittam anlamıyla her-diğer rumuzudur.
ircmaxell

6
Eğer çıkış kullanabileceğinizi biliyorsanız ("Çıkıyorum ...");
Yuda Prawira

4
23 şimdiye kadar sadece yanlış bir cevap için upvotes! Bu yüzden, sorunun tüm rakip cevaplarını okuyana ve hepsini anlayana kadar (hiçbir anlam ifade edemediğim korkunç yazılmış engelleri aşmadan) cevaplara asla oy vermem.
Mark Amery

3
Tam olarak @GeoffreyHale'nin cevabında yazdığı şey budur. Ne cevap olarak yayınlanmıştır biri Perl veya C gibi bir dilde gelen ne beklenir Ama diğerleri de belirtildiği gibi öyle değil php için de geçerlidir. Cevabınızı bunu yansıtacak şekilde düzenlemeyi veya başka türlü silmeyi düşünebilirsiniz.
Levite
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.