exit()
Функция exit() в PHP немедленно завершает текущий скрипт и возвращает указанный код завершения. Полезна при перенаправлении и критических ошибках.
Что делает функция exit()
Функция exit() в PHP останавливает текущий скрипт в том месте, где она вызвана. После неё не выполняется никакой код — скрипт завершается немедленно. Чаще всего она используется для остановки выполнения после перенаправления, при обнаружении критической ошибки или для вывода финального сообщения перед выходом.
exit — это языковая конструкция, а не обычная функция, поэтому скобки необязательны: exit; и exit(); работают одинаково. die() является точным псевдонимом exit() — они ведут себя идентично, и выбор между ними — исключительно вопрос стиля. Подробнее о псевдониме см. в главе die().
На этой странице рассматривается, что делает exit(), разница между аргументами статуса и сообщения, коды завершения, которые она возвращает оболочке, а также распространённые ошибки, которых следует избегать.
Синтаксис и необязательный аргумент
exit(int|string $status = 0): neverexit() принимает один необязательный аргумент — либо целое число, либо string, и они обрабатываются совершенно по-разному:
- Целое число — используется как код завершения процесса (0–254). Оно не выводится на экран. По соглашению,
0означает успех, а любое ненулевое значение сигнализирует об ошибке. Это важно, когда скрипт запускается из командной строки и другая программа проверяет его код завершения. - String — выводится непосредственно перед завершением скрипта, после чего код завершения равен
0. Удобно для отображения финального сообщения об ошибке.
Если вызвать exit() без аргументов, скрипт завершится со статусом 0 и ничего не выведет.
Вывод сообщения перед выходом
Если передать string, PHP выведет его и затем остановится:
<?php
$config = @file_get_contents('config.ini');
if ($config === false) {
exit("Fatal: config.ini could not be read.\n");
}
echo "Config loaded.\n";Если файл отсутствует, скрипт выведет Fatal: config.ini could not be read., и финальный echo никогда не выполнится.
Возврат кода завершения в оболочку
При передаче целого числа ничего не выводится, но это значение становится кодом завершения процесса — полезно для скриптов, запускаемых из терминала или CI-конвейера:
<?php
$ok = false; // pretend a check failed
if (!$ok) {
exit(1); // non-zero = failure
}
exit(0); // successЗапуск этого скрипта командой php script.php, а затем echo $? в оболочке выведет 1. Вызывающая программа может ветвиться по этому коду, не разбирая никакой вывод.
Остановка скрипта после перенаправления
Классический сценарий использования в веб-разработке — гарантировать, что никакой код не выполнится после отправки заголовка Location:
<?php
if (!isset($_SESSION['user'])) {
header('Location: login.php');
exit();
}
// Protected code below only runs for logged-in users.Без exit() PHP продолжал бы выполнять строки после перенаправления — потенциально передавая защищённый вывод пользователю, которого следовало направить на страницу входа. Подробнее о компонентах этого фрагмента см. в главах header() и PHP Sessions.
Распространённые подводные камни
exit()выполняет функции завершения и деструкторы объектов, но не сбрасывает буфер вывода, запущенный черезob_start(), если выход происходит в середине буфера в старых конфигурациях — явно закрывайте буферы там, где это важно.- Коды статуса выше 254 зарезервированы. Используйте значения
0–254;255используется внутри PHP. - Не используйте
exit()как обычное управление потоком. Внутри функций возвращайте значение или выбрасывайте исключение, чтобы вызывающий код мог отреагировать.exit(), скрытый внутри функции, делает код трудно тестируемым, так как убивает весь процесс вместо того, чтобы просто завершить вызов. - Аргумент-string не является кодом ошибки.
exit("5")выводит5и завершается со статусом0, тогда какexit(5)завершается со статусом5и ничего не выводит.
Резюме
exit() (и его псевдоним die()) немедленно завершает PHP-скрипт. Передайте целое число, чтобы задать код завершения оболочки, или string, чтобы вывести финальное сообщение. Идеально подходит для остановки после перенаправления или при неустранимой ошибке, однако для обычного ветвления предпочитайте if/else, возвращаемые значения и исключения, чтобы код оставался тестируемым.