Exit, exit(), exit (0), die(), die (0) - Как выйти из script

Я считаю, что все эти (и даже die() или die(0)) идентичны. Если они не идентичны, что предпочтительнее для выхода из script успешно? Если они идентичны, есть ли какой-либо предпочтительный стандарт для успешного завершения script? Я использую exit;.

EDIT: все ответы имеют "die() и exit() идентичны", хотя я говорю это в своем вопросе. Я обновился до названия, чтобы надеяться, что он станет понятным, что это НЕ мой вопрос. Я хочу четко указать успех из командной строки script.

Ответ 1

Все они идентичны. Я уверен, что die() - это просто псевдоним для exit(), но даже если это не так, он все равно действует одинаково.

Когда одной из этих функций присваивается строковый аргумент, он выводит строку перед завершением процесса. Когда он встречается с целым числом до 255, это целое считается кодом возврата для процесса, который возвращается к процессу, вызывающему PHP script. Это особенно полезно при написании приложений с командной строкой (PHP не работает только в Интернете!).

Что касается разницы между exit, exit() и exit(0), их действительно нет. Конечно, нет никакой разницы между первыми двумя, потому что exit является технически конструкцией языка, а не функцией, поэтому ее можно вызвать с круглыми скобками или без них, как и echo. Возврат кода 0 означает, что "эта программа успешно работала/без ошибок", и пока я не знаю, что именно происходит, когда вы не передаете аргумент, PHP.net говорит, что аргумент exit указывает на успех, поэтому я бы поспорил, что он возвращает 0, хотя снова PHP.net не показывает по умолчанию для аргумента.

Ответ 2

Как уже упоминали несколько человек, die() и exit() абсолютно одинаковы.

Если вы посмотрите документацию PHP, есть два варианта аргументов:

  • Числовое значение. Это полезно только в том случае, если вы используете PHP из командной строки, а не веб-сервер. Нулевое значение указывает на успех. Ненулевое значение указывает на то, что произошла ошибка.

  • Строковое значение. Это будет отображено в браузере, когда произойдет выход.

Вместо die() или exit() я рекомендую использовать исключения и пользовательский обработчик исключений верхнего уровня для управления условиями сбоя.

Таким образом, вы получаете больше возможностей для автоматической регистрации ошибок. Кроме того, если вы используете PHP для реализации JSON API, этот обработчик исключений может вместо этого вернуть верный, указывающий на ошибку фрагмент JSON.

Ответ 3

Я бы сказал, что в отношении лучшей семантики die($arg); следует использовать для ненормального или неожиданного завершения, даже когда -of course- вы все еще поймали его. И exit($arg); следует использовать для нормального (ожидаемого/контролируемого) завершения процесса, как в break; для структуры for или while или switch, но с определенным концом.

Тем не менее... лично я часто использую общую структуру if { } else { } для управления различными ветвями огромных процессов или буферизации вывода, поэтому не нужно использовать "выход"..

Я также использую die($arg) в простой семантике обнаружения ошибок, как в

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

Ответ 4

die(); является просто синонимом exit(); и функционально идентичен.

Стандартный способ - использовать код выхода 0 для обозначения успеха и что-то еще, чтобы обозначить условие ошибки.

Ответ 5

die() обычно используется для уничтожения script с выходом ошибки:

die("There was a fatal error");

where-as exit обычно используется как успешный выход (по крайней мере, в моем кодировании)

Руководство PHP говорит, что функции идентичны.

Ответ 6

die в точности эквивалентен exit.

Из руководства:

Если статус является целым числом, это значение будет использоваться в качестве статуса выхода.

Это полезно, только если у вас есть какая-то оболочка, которая делает что-то, основанную на статусе выхода. Если у вас нет необходимости сообщать код выхода во внешний мир, просто exit;.

Ответ 7

Я буду опущен до черта, но в некоторых случаях при взломе в CLI мы не хотим, чтобы программа была убита, не желая продолжать полное выполнение.

Здесь цель состоит в том, чтобы не делать вызовы API в отдельный файл hand-point. Скажем, у меня есть приятная кнопка воспроизведения в моем интерфейсе, которая выполняет системные вызовы.

Пример 1: программа убивается после выполнения задания, данные не возвращаются. Это не хотел.

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

Пример 2. Программа по-прежнему работает, передавая все данные в запросе GET. Это не нужно в этом случае. Это замедляет работу браузера со всеми данными, которые у него уже есть.

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

Пример 3. Программа по-прежнему работает, данные не возвращаются, как ожидалось, команда воспроизведения была выполнена, но весь набор данных проанализирован, это ненужная работа, может замедлить работу php/machine.

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

Пример 4. Программа по-прежнему работает, данные не возвращены, как ожидалось, команда воспроизведения была выполнена, все данные не были проанализированы, php вернул супер быстро 200OK с пустым ответом, как и ожидалось, Все счастливы!

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

Да! Используя GOTO, иногда считается -as лучшим, что можно сделать 🔨 -!

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

/img/ee728e39e1769f1d408fe1c91d95c5a9.png