exit、exit()、exit(0)、die()、die(0)-スクリプトを終了する方法


81

私はこれらすべて(そしてさらにdie()またはdie(0))は同一であると信じています。それらが同一でない場合、スクリプトを正常に終了するためにどちらが好ましいですか?それらが同一である場合、スクリプトが正常に完了したことを示すための好ましい基準はありますか?私は使う傾向がありますexit;

編集:私の質問でそれを言ったとしても、すべての答えは「die()そしてexit()同一」です。これが私の質問ではないことを明確にするために、タイトルを更新しました。コマンドラインスクリプトから成功を明確に示したいと思います。


4
私はそれらが同一であると信じていますstackoverflow.com/questions/1795025/…–
Doug Owings

これらのいずれも使用しないでください...エコーとリターンの組み合わせを使用してください。

2
@HiroProtagonistは完全に同意しません。return別の意味合いがあります
爆発ピル

回答:


67

これらはすべて同じです。のdie()単純なエイリアスであると確信していますがexit()、そうでない場合でも、同じように動作します。

これらの関数の1つに文字列引数が指定されると、プロセスを終了する前に文字列が出力されます。255未満の整数が検出されると、その整数はプロセスの戻りコードと見なされ、PHPスクリプトを呼び出したプロセスに返されます。これは、コマンドラインアプリケーションを作成するときに特に役立ちます(PHPはWeb専用ではありません!)。

、、、の違いについてexitexit()exit(0)実際にはありません。exit技術的には関数ではなく言語構造であるため、最初の2つの間に間違いなく違いはありません。したがって、のように、括弧の有無にかかわらず呼び出すことができますecho。のコードを返す0ことは「このプログラムは正常に/エラーなしで実行された」という意味であり、引数を渡さないと正確に何が起こるかはわかりませんが、PHP.netは引数なしexitは成功を示すと言っているので、きっとを返しますが0PHP.netは引数のデフォルトを表示しません。


3
exit(0)成功して終了することをexit(1)意味し、失敗して終了することを意味します。
Yousha Aleayoub 2017

参考までに、文字列パラメータを使用してexit(またはdie)を呼び出したときの実際の終了コードは、どこにも明示的に言及されていません(PHPマニュアルを含む)。たとえば、一般的なdie(-1)イディオムを見てdie("Poo!...")、多くのことを呼びますが、結局のところ、それほど確信が持てないかもしれません。とにかく、推測は他の職業に属する必要があります...したがって、FTR:0です。これは、後者die("error!")が最も実際には、CLIスクリプトのバグである可能性があります。:-o
Szを。

6

何人かの人が言及したように、die()とexit()はまったく同じです。

PHPのドキュメントを見ると、引数には2つのオプションがあります。

  • 数値。これは、Webサーバーではなく、コマンドラインからPHPを使用している場合にのみ役立ちます。ゼロの値は成功を示します。ゼロ以外は、障害状態が発生したことを示します。

  • 文字列値。これは、終了時にブラウザに表示されます。

die()またはexit()の代わりに、例外とカスタムのトップレベルの例外ハンドラーを使用して障害状態を管理することをお勧めします。

自動エラーログのようなことを行うために、その方法でより柔軟性があります。また、PHPを使用してJSON APIを実装している場合、この例外ハンドラーは、代わりに有効なエラーを示すJSONスニペットを返すことができます。


失敗の状況は理解していますが、成功を正しく示したいと思います。
爆発ピル2011年

通常の場合、ブラウザベースのインタラクションはdie()だけです。phpのコマンドラインでの使用については、die(0)を実行してください。
nsanders 2011年

言及する価値があります... die()自体はエラー状態を示しません。すべてのphpスクリプトの実行を停止するだけです。
nsanders 2011年

+1コマンドラインについて言及すると、コマンドラインphpを忘れる人が多すぎます
John Magnolia

@JohnMagnolia:しかし、「終了時にブラウザに表示される」と言ったとき、彼はすぐ下の同じことを忘れていました。;)(もちろん、CLIコンソールにも表示されます。)
Sz。

5

より良いセマンティクスに関してはdie($arg);、たとえあなたがまだそれを捕まえているとしても、異常なまたは予期しない終了のために使用されるべきであると私は言います。また、またはまたは構造の場合のexit($arg);ように、プロセスの通常の(予期される/制御される)終了に使用する必要がありますが、最終的な終了があります。break;forwhileswitch

それにもかかわらず、私は個人的にif { } else { }、巨大なプロセスのさまざまなブランチや出力バッファリングを制御するために一般的な構造を使用することが多いため、「exit」を使用する必要はありません。

またdie($arg)、次のような単純なエラーキャッチセマンティクスでも使用します。

$db = mysql_connect([$args]) or die ($error); ..。


1

die();は単なる同義語でexit();あり、機能的には同じです。

標準的な方法は、終了コード0を使用して成功を示し、その他のコードを使用してエラー状態を示すことです。


1

die()は通常、エラー出力でスクリプトを強制終了するために使用されます。

die("There was a fatal error");

where-exitは通常成功したexitとして使用されます(少なくとも私のコーディングでは)

PHPマニュアル機能が同一であることを述べています。


1

私は地獄に反対票投じますが、CLIでハッキングするときに、完全な実行を継続したくないのに、プログラムを強制終了たくない場合があります。

ここでの目標は、別のハンドポイントファイルへのAPI呼び出しを回避することです。システムコールを実行する、インターフェイスに素敵な再生ボタンがあるとします。

例1:プログラムはジョブの後に強制終了され、データは返されません。これは望まれていません。

if ($_GET["play"] != ""){
  // Some job
  exit; 
}
/* Huge amount of data*/ 

例2:プログラムは引き続き実行され、GETリクエストでデータ全体をフィードします。この場合、これは不要です。これは、彼がすでに持っているすべてのデータでブラウザの速度を低下させています。

if ($_GET["play"] != ""){
  // Some job
}
/* Huge amount of data*/ 

例3:プログラムは引き続き実行され、期待どおりにデータが返されず、playコマンドが実行されましたが、データセット全体が解析されます。これは不要なジョブであり、php /マシンの速度が低下する可能性があります。

/* Huge amount of data*/ 
if ($_GET["play"] != ""){
  // Some job
}

例4:プログラムは引き続き実行され、期待どおりにデータが返されませんでした。playコマンドが実行され、データ全体が解析されていませんでした。phpは、予想どおり、空の応答で200OKを非常に高速に返しました。みんな幸せ!

if ($_GET["play"] != ""){
  // Some job
  goto END;
}
/* Huge amount of data*/
END;

はい!GOTOを使用すると、-最善の方法として-と見なされることがあります🔨-!

https://www.php.net/manual/en/control-structures.goto.php

https://i.stack.imgur.com/kQnqC.png


0

dieとまったく同じexitです。

マニュアルから

statusが整数の場合、その値が終了ステータスとして使用されます。

これは、終了ステータスに基づいて何かを実行するある種のラッパーがある場合にのみ役立ちます。終了コードを外部に報告する特別な必要がない限り、ただexit;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.