exit, exit (), exit (0), die (), die (0) - Как выйти из скрипта

81

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

РЕДАКТИРОВАТЬ: Все ответы имеют « die()и exit()идентичны», хотя я говорю это в своем вопросе. Я обновил заголовок, чтобы, надеюсь, прояснить, что это НЕ мой вопрос. Я хочу четко указать на успех из сценария командной строки.

Таблетки от взрыва
источник
4
Я считаю, что они идентичны stackoverflow.com/questions/1795025/…
Дуг Оуингс
не используйте их ... просто используйте комбинацию echo и return.
2
@HiroProtagonist полностью не согласен; returnимеет другое значение
Explosion Pills

Ответы:

67

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

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

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

AgentConundrum
источник
3
exit(0)означает выход с успехом, exit(1)означает выход с ошибкой.
Юша Алеайуб
FYI, никогда явно нигде не упоминается (включая руководство по PHP), каким будет фактический код выхода при вызове exit(или die) со строковым параметром. Увидев, например, обычную die(-1)идиому, а также die("Poo!...")много звонков, можно не быть в этом так уверенным, и в любом случае: угадывание должно принадлежать другим профессиям ... Итак, FTR: это 0. Что также означает, что последнее die("error!")было бы наиболее скорее всего, это ошибка в сценариях CLI! : -o
Sz.
6

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

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

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

  • Строковое значение. Это будет отображаться в браузере при выходе.

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

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

нсандерс
источник
Я понимаю условия отказа, но хочу правильно указать на успех.
Explosion Pills
Для нормального взаимодействия через браузер просто die (). Для использования php в командной строке do die (0).
nsanders 07
Стоит упомянуть ... die () сам по себе не указывает на ошибку. Он просто останавливает выполнение всех скриптов php.
nsanders 07
+1 упоминая командную строку, слишком многие люди забывают о командной строке php
Джон Магнолия
@JohnMagnolia: Но потом он забыл о том же самом, сразу ниже, когда сказал, что «будет отображаться в браузере при выходе». ;) (Конечно, это тоже отображается в консоли CLI.)
Sz.
5

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

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

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

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

Jjyepez
источник
1

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

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

слизь
источник
1

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

die("There was a fatal error");

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

В руководстве по PHP сказано, что функции идентичны.

xthexder
источник
1

Я проиграю к черту , но в некоторых случаях при взломе в 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 / машины.

/* 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 иногда считается лучшим решением 🔨 -!

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

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

NVRM
источник
0

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

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

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

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

Хэмиш
источник