PHPのdie()とexit()の違いは何ですか?


679

違いは何ですかdie()exit()PHPの関数は?

どちらも同じ機能だと思いますが、どちらも違うのではないかと思いますが…何ですか?


2
exit()は数値の終了ステータスでプログラムを停止しますが、die()はエラーメッセージをstderrに出力し、EXIT_FAILUREステータスで終了します。so exit() is exit and die() is also exit :)
Muhammad Shahzad

回答:


541

違いはありません-それらは同じです。

PHPマニュアルexit

注:この言語構​​成はと同等die()です。

PHPマニュアルdie

この言語構​​造はと同等exit()です。


17
エイリアスを使用すると、プログラマは使い慣れたエイリアスを使用できます。私は死ぬより出口をよく覚えている。他の何人かは、退出するより死ぬほうがいいと覚えています。
モーリス2009年

28
これ(php.net/manual/en/aliases.php)は、2つの関数が同じことをする理由を説明するかもしれません
Marek Karbarz 09年

86
それらは同じことを行いますが、通常die、エラー関連の停止およびexit他のすべてのシナリオのために予約します。コードを読むと、フローが良くなるようです。
nextgentech 2014年

7
これを復活させて申し訳ありませんが、少なくとも私にとっては... die書くよりもはるかに速いexitです...私はexitそれがPHP以外のプログラマにとって読みやすいので使い始めていdieますが、あなたがいるときにタイプする方が速いだけです急ぎ。また、入力するときに、手を書く位置を変える必要もありませんdie
AlejandroIván2015

7
@ mauris、1つの関数の名前が1つだけ方がはるかに優れています。すべてのPHP関数に2つの名前があり、完全に混乱していると想像してください。
Pacerier 2015年

221

起源の違い

PHP die()との違いexit()はその起源ですです。


機能的に同等

die() そして exit()されている同等の機能。

PHPマニュアル

PHPマニュアルdie

この言語構​​造はと同等exit()です。

PHPマニュアルexit

注:この言語構​​成はと同等die()です。

関数エイリアスのリストの PHPマニュアル:

die マスター関数のエイリアスです exit()


他の言語で異なる

die()そして、exit()されている他の言語で異なりますが、PHPで、彼らは同じです。

さらに別のPHPの暴言

... CとPerlのコーダーとして、「exit()は数値の終了ステータスでプログラムを停止するのに対し、die()はエラーメッセージをstderrに出力し、EXIT_FAILUREステータスで終了します。 」しかし、私は私たちがPHPの乱雑な構文領域にいることを思い出しました。

PHPでは、exit()とdie()は同じです。

デザイナーは明らかに「うーん、Cからexit()を借りましょう。Perlの人々は、die()をそのままPerlから取得する場合は、おそらく気に入ってくれるでしょう。おっと!2つの出口関数があるので、両方作成してみましょう文字列または整数を引数として取り、それらを同一にすることができます!」

最終結果は、これは実際には「より簡単」なものにはならず、混乱を招くだけです。CおよびPerlのコーダーは引き続きexit()を使用して整数の終了値のみをトスし、die()を使用してエラーメッセージをトスし、失敗して終了します。初心者や最初の言語としてのPHPの人々は、「うーん、2つの出口関数のうちどれを使用すればよいのか」と疑問に思うでしょう。マニュアルには、exit()とdie()がある理由が説明されていません。

一般に、PHPにはこのような奇妙な冗長性がたくさんあります。異なる言語のバックグラウンドを持つ人々に親しみやすいように努めていますが、そうすることで混乱を招きます。


14
これは、100番目の回答が同等であることを示すものです(私の回答にも記載されています^^)が、これは本当にいくつかの非常に良い点を追加します。何よりも、他の言語では同じではない(したがって、そもそも混乱)。(+1)
Levite、2015

@Levit、いや、いや、それは完全に間違っている。誰も名前を所有しておらず、異なる言語が同じ名前を等しくない方法で再利用しています。もう1つの標準的な方法で作業を行う必要がないため、これで問題ありません。PHPに割り当てることにより、「最初の場所での混乱は、」ある2人の異なる名前を一つの機能に...
Pacerier

2
@Pacerier:もちろん、「だれが悪いのか」という点から見ると、それはまったく正しい。それでも、それらが複数の言語で異なることを単に意味していることも事実です(これは問題ありません)。ニュートラルな観点から見ると、間違いなく当てはまります。意味が異なるため、混乱が生じます(たとえ2つの等しい関数エイリアスを作成するのがphpのせいでも)。私が間違いなくそれらの言語のいずれかに指を向けたくなかったのであれば、それが私のコメントから理解できたのであれば...(素晴らしいxkcd btw(Y)^^)
Levite

2
これは間違いなく選ばれた答えであるはずです、良い説明!
コーディブラウン

別のユーザーがexit()、接続を閉じている間は閉じないと回答しましたdie()が、それは関連があるようです。
ner0

62

前述のように、これら2つのコマンドは同じパーサートークンを生成します。

だが

小さな違いがあり、それはパーサーがトークンを返すのにかかる時間です。

私はPHPパーサーを研究していませんが、それが「d」で始まる関数の長いリストであり、「e」で始まる短いリストである場合、「 e "。また、関数名全体がどのようにチェックされるかにより、他の違いがある場合があります。

PHPの解析に特化した「完全な」環境と、さまざまなパラメーターを使用した多数のリクエストがない限り、測定可能ではないでしょうか。しかし、違いがあるに違いありません。結局のところ、PHPはインタプリタ言語です。


4
@Timeless、完璧主義者は「PHPはインタプリタ言語である」とは言いません。PHPは、サーバーの設定に応じて解釈またはコンパイルできる言語です。
Pacerier

29
そして...「死ぬ」は「出口」の4文字に対して3文字の長さです。したがって、メモリとファイル領域が25%削減されます。;)
Jan Derk

2
'"それが" d "で始まる関数の長いリストであり、" e "で始まる短いリストである場合、" e "で始まる関数の関数名を検索するのに時間がかかる必要があります。dで始まる関数を検索すると、時間のペナルティが発生することを意味します?通常、リストが大きいほど、その中のアイテムを検索する時間が長くなります
Pere

9
あなたが書いたように、あなたはPHPパーサーを研究していません。PHPの実装方法に関するあなたの夢に基づいているため、この役に立たない回答に感謝します。
ドルメン

44

ダイの PHPマニュアル:

die — exitと同等

あなたもdie;同じようにすることができますexit;括弧の有無にかかわらずます。

選択の唯一の利点 die()以上はexit()、あなたが余分な文字を入力するに割く時間があるかもしれない;-)


1
また、誰かが他の言語から来たときに、どちらかの方法である程度の親しみがある場合にも便利です
Rohan Khude 2017年

なお、(対話形式でPHPを実行する場合php -adie;die();exit;exit();しながら、何の効果もありませんexit(セミコロンなし)は、インタラクティブモードを終了します。
サンティアゴarizti

31

他のすべての正しい答えが言うように、dieそしてexit同じ/エイリアスです。

スクリプトの実行を期待どおりに終了したい場合は、を使用するという個人的な慣習がありますexit;。また、いくつかの問題(dbに接続できない、ファイルに書き込めないなど)が原因で実行を終了する必要がある場合はdie("Something went wrong.");、スクリプトを「強制終了」するために使用します。

私が出口を使うとき:

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.

私が死ぬとき:

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

このようにexitして、コードのある時点で、ロジックがここで終了するので、この時点で終了したいと思います。を見るとdie、実行を続けたいと思っていますが、前の実行のエラーのためにできないか、そうすべきではありません。

もちろん、これはプロジェクトだけで作業しているときにのみ機能します。より多くの人々がいるとき、誰も彼らが使うのを妨げないでしょう、dieまたはexitそれが私の慣習に合わないところで...


30

これはかなり興味深いものです。けれどもexit()die()等価です、die() クローズ接続を。接続をexit() 閉じません

die()

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

exit()

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

結果:

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

プロジェクトでこれを考慮する必要がある場合に備えてください。

クレジット:https : //stackoverflow.com/a/20932511/4357238


1
これは受け入れられる答えになるはずです。
ner0

2
ただ、それをテストし、exitそしてdie、それらの両方の密接な関係と同じように動作します。
Grzegorz Adam Kowalski

12

機能的には同じですが、コードを読みやすくするために、次のシナリオで使用します。

エラーが発生して実行を停止する必要がある場合は、die()を使用します。

例えば die( 'Oops! Something went wrong' );

エラーがなく、実行を停止する必要がある場合は、exit()を使用します。

例えば exit( 'Request has been processed successfully!' );


11

このページには、言うdieのaliesあるexitので、彼らは同じです。しかし、それも説明します:

APIのクリーンアップなどの理由で名前が変更された関数があり、古い名前は下位互換性のためのエイリアスとしてのみ保持されます。これらの種類のエイリアスは、陳腐化したり名前が変更されたりして、移植できないスクリプトにつながる可能性があるため、通常は使用しないことをお勧めします。

だから、私を偏執狂と呼んでください、しかしdie将来は何もないかもしれません。


3
また、言ういくつかのケースでは、複数のものの間には優先名がない、is_int()そしてis_integer()例えば同じように良いです。php-srcGitHub のコミット履歴を見ると、die()少なくとも1999年以降、SVNリポジトリに変換されてから、おそらく言語が存在している限り、PHPに構造が存在します。それが非推奨になることを想像するのはばかげているようです。
Mark Amery 2014年

2
@MarkAmery、彼の前提は彼の結論につながらないが、結論自体は有効である:〜「私を偏執狂と呼んでください、しかしexit将来はないかもしれません。あるいは将来ないかもしれませんdie
Pacerier

@Pacerierかなり正しい。将来的にはPHPがなくなる可能性があるので、このプログラミングのギグをすべてやめて、アンダーテイカーまたはタックスコレクターになりましょう。結局のところ、確実なのは死と税金だけです。
Mark Amery 2015年

@MarkAmery、「将来的にはPHPなし」は平均以上の偏執狂を超えているようです。歴史は、めちゃくちゃ人気のある言語がそれほど簡単には消えないことを示しています(Fortran!)。
Pacerier、2015

1
偏執狂しないでください。出口死ぬことはありませ。:)
ドルメン


6

これらは基本的に同じですが、この記事ではそうではありません。


1
その記事は奇妙です。スキャナーの定義から、それらが同等であることがわかります。違いがある場合、おそらくテストはopcacheなしで実行されました。
ジャック

この記事は、コードが公開されていないため再現できないベンチマークに関するものです。無視してください。
ドルメン

0

機能的には同じです。したがって、どちらを使用するかを選択することは、完全に個人的な好みです。意味的に英語では、それらは異なります。ダイはネガティブに聞こえます。JSONデータをクライアントに返し、プログラムを終了する関数がある場合、この関数をjsonDie()と呼ぶと恐ろしいことがあり、jsonExit()と呼ぶ方が適切です。そのため、私は常に死ぬ代わりに出口を使います。


OPはPHPのexitとdie関数のみについて尋ねています。
Black Mamba

1
はい、私はその質問だけに答えていました。ただし、注意が必要なのは機能の違いだけではありません。
Luo Jiong Hui

私の最も素敵な関数の1つはpd()と呼ばれます-つまり、Pie Dieです。したがって、そのような状況では、死ぬのが悪いことかどうかはわかりません:)
Ivan Ponomarev

フルスタックの開発者として、私は自分をプログラマーとしてだけでなく、ユーザーエクスペリエンスデザイナーとしても見ています。そしてこの文脈では、同情は重要です。同情は、UIのデザイン方法だけでなく、コーディング方法にも影響します。
Luo Jiong Hui、2018

0

ここでこの質問を見たときに知っていることから

「PHPでは、ヘッダー出力に明確な違いがあります。以下の例では、異なるヘッダーを使用することを選択しましたが、exit()とdie()の違いは重要ではありません。」テスト済み(個人的に)


-3

w3schoolsのクイズ:die()関数とexit()関数はまったく同じことをしますか?私の答えは間違っています。不正解です。正しい答えは本当です。

これがスクリーンショットです: ここに画像の説明を入力してください


-5

少なくとも私のスクリプトで気付いたのは、exit()が現在実行中のスクリプトを停止し、制御を呼び出し元のスクリプトに戻す一方で、dieがphpのトラックを停止することです。それはかなり大きな違いだと思いますか?


1
@AdarshMadrechaこれは真実ではありません。それらがサブ関数の内部または外部にある場合、phpスクリプトは常に停止します。
MERTDOĞAN18年

-5

exit()関数とdie()関数の結果は常に同じです。しかし、エイリアスのマニュアルページ(http://php.net/manual/en/aliases.php)で説明されているように、die()関数はexit関数を呼び出すと記載されています。私はそれが以下のようにハードコーディングされていると思います:

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

これは中小規模のプロジェクトのパフォーマンスの問題ではありませんが、プロジェクトに数十億、数十億、数十億のプロセスがある場合、これは非常に重要なパフォーマンス最適化状態になります。

しかし、非常に多くの人は、これが問題であるとは考えていません。多くのプロセスがある場合、関数がマスターまたはエイリアスである場合よりも、もっと問題を考えなければならないからです。

しかし、正確な答えはそれです。常にマスター機能はエイリアスよりも高速です。

最終的に; Aliasのマニュアルページには、dieはもう使用できないと書かれています。これは単なる別名であり、非推奨です。

これらの種類のエイリアスは、陳腐化したり名前が変更されたりして、移植できないスクリプトにつながる可能性があるため、通常は使用しないことをお勧めします。このリストは、古いスクリプトを新しい構文にアップグレードしたい人のために提供されています。


2
エイリアスは「関数の呼び出し」ではありません。仮説を詳しく説明する前に、仮定を確認してください。
ドルメン

@dolmenエイリアスは常にハードコードでメイン関数を呼び出します。これは一般的なプログラミング規則です。
MERTDOĞAN18年1

@MERTDOĞANエイリアスは何も呼び出しません。エイリアス(プログラミングまたは実生活)は、オブジェクトの別の名前です(すでに名前が付けられています)。die()独立した機能ではありません。の別名ですexit()。この回答には、エイリアスとそのパフォーマンスに関する誤った記述が含まれています。
axiac '15年

docs.php.net/manual/en/… 上記の例のように、エイリアスは常に呼び出されます。何かを学び、戻ってきてください。
MERTDOĞAN2018年

-10

ほぼ同じように聞こえますが、exit()を使用すると、PHPスクリプトの終了コードを設定することもできます。

通常、実際にはこれは必要ありませんが、コンソールのPHPスクリプトを作成するときは、スクリプトがすべてを正しく完了したかどうか、たとえばBashで確認することができます。

次に、exit()を使用して、後でキャッチできます。Die()はそれをサポートしていません。

Die()は常にコード0で存在します。基本的に、die()コマンドは次のことを行います。

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

これは次と同じです:

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

42
それは真実ではない。 dieexit同じです(同じパーサートークン(T_EXIT)を生成し、同じコードによって実行されます)。パラメータが整数の場合、そのコードをシェルに返します。そうでない場合は、出力して0を返します。したがってdie、およびexitは、文字通りお互いのエイリアスです。
ircmaxell

6
よく知っている場合は、exit( "I'm exiting ...");を使用できます。
Yuda Prawira 2013

4
これまでのところ23の賛成票を投じ、答えは単に誤りです。これが、質問に対する競合するすべての回答を読み、それらをすべて理解するまで(私が理解できないひどく書かれたものを除いて)、私が回答に投票しない理由です。
Mark Amery 14

3
これはまさに@GeoffreyHaleが彼の答えで書いていることです。あなたが答えとして投稿したのは、PerlやCのような言語から来ると予想されるものです。しかし、他の人が述べたように、phpに当てはまりません。あなたは本当にこれを反映するためにあなたの答えを編集するか、そうでなければそれを削除することを検討するかもしれません。
Levite、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.