【PHP】exitの使い方|die との違い・引数の挙動・使いどころと注意点

PHPの exit はスクリプトの実行を即座に終了させます。エラー時の打ち切りや、header() でのリダイレクト後によく使われます。この記事では基本に加え、引数(文字列/整数)による挙動の違い使いどころの注意点まで解説します。

この記事の結論:exit; でスクリプトを終了します。文字列を渡すと出力され、終了コードは0整数を渡すとそれが終了コードになり、画面には出力されませんdieexit の別名で機能は同じです。
スポンサーリンク

exitの基本的な使い方

exit は関数のように書けますが、実は言語構造なので引数がなければカッコも省略できます。実行されると、それ以降のコードは動きません。

exitで終了
<?php
if (!file_exists("important_file.txt")) {
    exit("ファイルが見つかりません。"); // メッセージを出して終了
}

echo "この行は実行されません。";

引数による挙動の違い(文字列 vs 整数)

ここは混同しやすいポイントです。文字列を渡すと「出力」され、終了コードは0(正常)になります。一方、整数を渡すとそれが「終了コード」になり、画面には出力されません。

文字列と整数で意味が違う
<?php
exit("エラーメッセージ"); // 画面に出力 → 終了コードは 0(正常)
exit(1);                 // 終了コード 1(エラー)→ 出力はされない
exit(0);                 // 終了コード 0(正常)
終了コードは シェルやcronからPHPをCLI実行したときに意味を持ちます(0 が正常、1 以上がエラー、という慣例)。exit("msg") はメッセージを出すだけで、終了コードは 0 のままです。

注意:WebではexitはHTTPステータスを変えない

よくある誤解として、exit(1)exit("error")HTTPステータスがエラー(500など)になると思いがちですが、なりません。exitの引数はCLIの終了コード用で、HTTPレスポンスのステータスとは無関係です。エラーを示したいなら http_response_code() を併用します。

HTTPでエラーを返したいとき
<?php
http_response_code(500);     // HTTPステータスを明示
exit("内部エラーが発生しました");

header()リダイレクト後はexitを付ける

リダイレクトで header("Location: ...") を送った後は、必ず exit で処理を止めます。これを忘れると、リダイレクトしても以降のコードが実行され続けてしまい、意図しない処理や情報漏えいの原因になります。

リダイレクト後は必ずexit
<?php
if (!$loggedIn) {
    header("Location: /login.php");
    exit; // ← これが無いと以降の処理が続いてしまう
}
リダイレクト全般はリダイレクトを行う方法まとめ、header送信でつまずく「headers already sent」エラーはCannot modify header information エラーの対処法を参照してください。

使いすぎに注意(アプリ・フレームワーク)

小さなスクリプトでは便利ですが、アプリやフレームワークの中で安易に exit を多用するのは避けましょう。途中で強制終了すると、後続のクリーンアップ処理が飛ばされ、テストもしにくくなります。関数からは return で戻る、エラーは例外(throw)で扱うのが基本です。

dieexit完全な別名で、動作に違いはありません。チームでどちらかに統一しておくと読みやすくなります(「終了」の意図が伝わりやすい exit が好まれることが多いです)。

よくある質問(FAQ)

Qexitとdieはどちらを使うべきですか?
Aどちらでも構いません。dieexit の別名で機能は同じです。チーム内で統一するのがおすすめで、「終了」の意図が明確な exit がよく使われます。
Qexit(“メッセージ”)の終了コードは何になりますか?
A0(正常終了)です。文字列を渡すとそれは「出力」され、終了コードには影響しません。エラーコードを返したい場合は exit(1) のように整数を渡します(この場合は出力されません)。
Qexit(1)を呼べばHTTPが500になりますか?
Aなりません。exitの引数はCLIの終了コード用で、HTTPステータスとは無関係です。エラーを返すには http_response_code(500) を別途呼んでください。
Qリダイレクト後にexitは必要ですか?
A必要です。header("Location: ...") の後に exit を入れないと、以降のコードが実行され続けてしまいます。リダイレクト時はセットで書く習慣をつけましょう。

まとめ

PHPのexitのポイントを整理します。

  • exit; でスクリプトを即終了(die は別名)
  • 文字列→出力&終了コード0、整数→終了コード(出力なし)
  • exitの引数はHTTPステータスに影響しないhttp_response_code() を併用)
  • header() リダイレクト後は必ず exit
  • アプリ内では多用せず、return や例外で扱うのが基本

関連として、リダイレクトを行う方法headers already sent エラーの対処法Call to undefined function の対処法もあわせて読むと、PHPの制御・エラー処理に強くなれます。