В чем разница между die () и exit () в PHP?

В чем разница между функциями die() и exit() в PHP?

Я думаю, что у обоих одинаковые функции, но я сомневаюсь, что в обоих есть что-то другое ... что это?


person coderex    schedule 25.11.2009    source источник
comment
exit () просто завершает программу с числовым статусом выхода, в то время как die () выводит сообщение об ошибке в stderr и завершает работу со статусом EXIT_FAILURE. so exit() is exit and die() is also exit :)   -  person Muhammad Shahzad    schedule 06.04.2016


Ответы (15)


Нет никакой разницы - они такие же.

Руководство по PHP для exit:

Примечание. Эта языковая конструкция эквивалентна die().

Руководство по PHP для die:

Эта языковая конструкция эквивалентна exit().

person Marek Karbarz    schedule 25.11.2009
comment
aliases позволяет программистам использовать тот, с которым удобно. Я лучше помню выход, чем смерть. Некоторые лучше запоминают смерть, чем выход. - person mauris; 25.11.2009
comment
это (php.net/manual/en/aliases.php) может дать некоторое объяснение почему 2 функции делают одно и то же - person Marek Karbarz; 25.11.2009
comment
Несмотря на то, что они делают то же самое, я обычно резервирую die для остановок, связанных с ошибкой, и exit для всех других сценариев. Просто кажется, что при чтении кода он течет лучше. - person nextgentech; 11.01.2014
comment
Извините, что возродил это, но, по крайней мере, для меня ... die гораздо быстрее писать, чем _2 _... Я начинаю использовать exit, потому что он более читается для программистов, не использующих PHP, но die просто быстрее набирает, когда ты очень торопишься. Кроме того, кстати, я печатаю, мне не нужно менять положение рук, чтобы написать die. - person Alejandro Iván; 27.02.2015
comment
@nextgentech, Вы его неправильно используете. Используйте exit(0) для успеха и exit($non_zero) для ошибок. - person Pacerier; 30.06.2015
comment
@MarekKarbarz, это не так. Он просто говорит, что оба одинаково хороши. - person Pacerier; 30.06.2015
comment
@mauris, лучше для одной функции иметь только одно имя. Представьте, что у каждой функции PHP есть два имени, это было бы полной неразберихой. - person Pacerier; 30.06.2015
comment
@Pacerier Как я что-то неправильно использую? Ваше утверждение просто игнорирует то, что die() вообще существует. - person nextgentech; 30.06.2015
comment
@nextgentech, я не говорю, что вам нужно выбирать exit вместо die или die вместо exit. Я предлагаю принять решение и выберите один. Любой из них подходит, не смешивайте оба в той же кодовой базе, если только вы не единственный, кто его разрабатывает / поддерживает. - person Pacerier; 02.07.2015
comment
Лично я использую die при выводе ошибки и выхожу после контролируемой остановки, как после перенаправления. Таким образом, проще искать правила ошибок в коде. - person Gilles Lesire; 30.03.2016
comment
@ AlejandroIván Если вы остро ощущаете прирост скорости от набора die вместо exit (и я согласен, что он есть), тогда вам следует серьезно подумать о переходе на раскладку клавиатуры, такую ​​как Dvorak - я думаю, вы действительно оцените ускорение после кривой обучения . - person mtraceur; 19.03.2017
comment
@Pacerier Слава богу, в PHP есть только дубликаты die и exit! Проверьте эту страницу: php.net/manual/en/aliases.php - person CJ Dennis; 03.12.2017
comment
@mtraceur, AlejandroIván действительно сказал, как я печатаю, мне не нужно менять положение рук, чтобы писать die, что означало бы, что они, вероятно, используют либо Dvorak, либо Colemak, поскольку qwerty помещает i и e в верхнюю строку - person 3ocene; 04.12.2018
comment
Попробуйте найти в кодировке все четыре дубликата. Есть utf8_encode (), iconv, UConvertor и многобайтовая строка. Но это еще не все: даты (IntlCalendar, DateTime и date ()), хеширование паролей и т. Д. Это уже большой беспорядок. - person Code4R7; 07.07.2019
comment
Я просто не люблю много думать о смерти, поэтому использую exit (); - person dan; 06.12.2019
comment
Это должен быть ответ: stackoverflow.com/a/50140070/4357238 - person Edward; 17.12.2019

РАЗНИЦА В ПРОИСХОЖДЕНИИ

Разница между die() и _ 2_ в PHP является их источником.


ФУНКЦИОНАЛЬНО ЭКВИВАЛЕНТНЫЙ

die() и _ 8_ - эквивалентные функции.

Руководство по PHP

Руководство по PHP для die:

Эта языковая конструкция эквивалентна exit().

Руководство по PHP для exit:

Примечание. Эта языковая конструкция эквивалентна die().

Руководство PHP для Список псевдонимов функций:

die - это псевдоним для основной функции _ 14_


РАЗНЫЕ НА ДРУГИХ ЯЗЫКАХ

die() и _ 16_ различны в других языках, но в PHP они идентичны.

Из еще одна тирада PHP:

... Как программист на C и Perl, я был готов ответить, почему exit () просто отключает программу с числовым статусом выхода, а die () выводит сообщение об ошибке в stderr и завершает работу со статусом EXIT_FAILURE. Но потом я вспомнил, что мы находимся в стране с запутанным синтаксисом PHP.

В PHP функции exit () и die () идентичны.

Дизайнеры, очевидно, подумали: "Хм, давайте позаимствуем exit () у C". И людям Perl, вероятно, понравится, если мы возьмем die () как и из Perl. Ой! Теперь у нас есть две функции выхода! Давайте сделаем так, чтобы они оба могли принимать в качестве аргумента строку или целое число и делать их идентичными!

В конечном итоге это не облегчило задачу, а только запутало ее. Программисты C и Perl будут продолжать использовать exit () для выдачи только целочисленного значения выхода и die () для выдачи сообщения об ошибке и выхода с ошибкой. Новички и люди, знающие PHP как первый язык, вероятно, зададутся вопросом: ммм, две функции выхода, какую из них мне следует использовать? В руководстве не объясняется, почему существуют exit () и die ().

В общем, PHP имеет много странной избыточности, подобной этой - он пытается быть дружелюбным по отношению к людям с разным языковым прошлым, но при этом создает сбивающую с толку избыточность.

person Geoffrey Hale    schedule 08.01.2015
comment
Несмотря на то, что это примерно 100-й ответ, в котором говорится, что они эквивалентны (как также видно в моем ответе ^^), это действительно добавляет ОЧЕНЬ хорошие моменты. Более того, они НЕ такие же на других языках (отсюда и путаница). (+1) - person Levite; 07.04.2015
comment
@Levit, нет-нет, вы понимаете совершенно не так. Никто не владеет именами, и в разных языках одни и те же имена используются неодинаково. Это нормально, потому что нам не нужен еще один стандартный способ работы. Путаница в первую очередь связана с присвоением PHP два разных имени одной функции .. - person Pacerier; 30.06.2015
comment
@Pacerier: Конечно, если вы посмотрите на это с точки зрения того, кто виноват, это абсолютно верно. Тем не менее, это также факт, что они просто означают разные вещи на нескольких языках (что нормально). Если посмотреть на это с нейтральной точки зрения, это определенно верно: существует путаница из-за разных значений (даже если это ошибка php в создании двух одинаковых псевдонимов функций). Я определенно не хотел указывать пальцем на какой-либо из этих языков, если это было то, что вы поняли из моего комментария ... (отличный xkcd btw (Y) ^^) - person Levite; 01.07.2015
comment
Это обязательно должен быть выбранный ответ, хорошее описание! - person Cody Brown; 24.04.2019
comment
Другой пользователь ответил, что exit() не закрывает соединение, в то время как die() делает это, кажется актуальным. - person ner0; 17.12.2019

Как указывалось ранее, эти две команды производят один и тот же токен парсера.

НО

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

Я не изучал синтаксический анализатор PHP, но если это длинный список функций, начинающийся с «d», и более короткий список, начинающийся с «e», тогда должно быть время на поиск имени функции для функций, начинающихся с « е ". И могут быть другие различия из-за того, как проверяется все имя функции.

Я сомневаюсь, что его можно будет измерить, если у вас нет «идеальной» среды, предназначенной для синтаксического анализа PHP, и множества запросов с разными параметрами. Но должна быть разница, ведь PHP - это интерпретируемый язык.

person Bob    schedule 01.11.2012
comment
@Timeless, перфекционисты не сказали бы, что PHP - это интерпретируемый язык. PHP - это язык, который можно интерпретировать или компилировать в зависимости от настроек вашего сервера. - person Pacerier; 30.06.2015
comment
И ... die имеет длину 3 символа против 4 для выхода. Таким образом, требуется на 25% меньше памяти и файлового пространства! ;) - person Jan Derk; 25.11.2015
comment
'если это длинный список функций, начинающийся с d, и более короткий список, начинающийся с e, тогда должен быть штраф времени на поиск имени функции для функций, начинающихся с e'. Разве вы не имели в виду, что при поиске функции, начинающейся с d, произойдет штраф по времени? Обычно чем больше список, тем больше времени нужно на то, чтобы найти в нем элемент. - person Pere; 17.12.2015
comment
Как вы писали, вы не изучали парсер PHP. Спасибо за этот бесполезный ответ, поскольку он основан на ваших мечтах о том, как реализован PHP. - person dolmen; 24.01.2018

Руководство PHP по die:

die - Эквивалент выхода

Вы даже можете делать die; так же, как exit; - с скобками или без них.

Единственное преимущество выбора die() перед exit() - это время, которое вы сэкономите на вводе дополнительной буквы ;-)

person Levite    schedule 19.02.2014
comment
это также удобно, когда кто-то пришел с другого языка, если они немного знакомы тем или иным образом - person Rohan Khude; 30.11.2017
comment
обратите внимание, что при интерактивном запуске php (php -a) die;, die();, exit; и exit(); не действуют, а exit (без точки с запятой) выходит из интерактивного режима. - person santiago arizti; 12.12.2019

Вот кое-что довольно интересное. Хотя exit() и die() эквивалентны, die() закрывает соединение. exit() не закрывает соединение.

die():

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

exit():

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

Результаты:

die():

HTTP/1.1 304 Not Modified 
Connection: close

exit():

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

На всякий случай необходимо учесть это в своем проекте.

Кредиты: https://stackoverflow.com/a/20932511/4357238

person Edward    schedule 02.05.2018
comment
Просто протестировал, и exit и die работают одинаково, они оба закрывают соединение. - person Grzegorz Adam Kowalski; 13.02.2020

Как говорится во всех других правильных ответах, die и exit идентичны / псевдонимы.

Хотя у меня есть личное соглашение, что, когда я хочу завершить выполнение сценария, когда это ожидается и желательно, я использую exit;. И когда мне нужно завершить выполнение из-за каких-то проблем (не могу подключиться к базе данных, не могу записать в файл и т. Д.), Я использую die("Something went wrong.");, чтобы «убить» скрипт.

Когда я использую выход:

header( "Location: http://www.example.com/" ); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit; // I would like to end now.

Когда я использую die:

$data = file_get_contents( "file.txt" );
if( $data === false ) {
    die( "Failure." ); // I don't want to end, but I can't continue. Die, script! Die!
}
do_something_important( $data );

Таким образом, когда я вижу exit в какой-то момент своего кода, я знаю, что на этом этапе я хочу выйти, потому что здесь логика заканчивается. Когда я вижу die, я знаю, что хочу продолжить выполнение, но не могу или не должен из-за ошибки в предыдущем выполнении.

Конечно, это работает только при работе над одним проектом. Когда людей станет больше, никто не помешает им использовать die или exit там, где это не соответствует моим соглашениям ...

person Lukas    schedule 15.07.2015

По функциональности они идентичны, но я использую их в следующих сценариях, чтобы сделать код читабельным:

Используйте die (), когда возникает ошибка и необходимо остановить выполнение.

e.g. die( 'Oops! Something went wrong' );

Используйте exit (), когда нет ошибки и нужно остановить выполнение.

e.g. exit( 'Request has been processed successfully!' );

person aagjalpankaj    schedule 26.10.2018
comment
довольно хорошее объяснение :) - person Rifkan Razak; 27.12.2020

Этот вывод из https://3v4l.org демонстрирует, что die и exit функционально идентичны. введите описание изображения здесь

person Simon77    schedule 12.06.2017

На этой странице указано, что die является союзником exit, поэтому они идентичны. Но также объясняет, что:

есть функции, которые изменили имена из-за очистки API или по какой-либо другой причине, а старые имена сохраняются только как псевдонимы для обратной совместимости. Обычно использование таких псевдонимов - плохая идея, поскольку они могут быть устаревшими или переименованными, что приведет к непереносимости скрипта.

Так что называйте меня параноиком, но может не быть die в будущем.

person Pedram Behroozi    schedule 22.04.2014
comment
В нем также говорится: В некоторых случаях среди нескольких нет предпочтительного имени, например is_int() и is_integer() одинаково хороши. Глядя на php-src историю коммитов на GitHub, конструкция die() была как минимум в PHP с 1999 года, когда он был преобразован в репозиторий SVN, и, вероятно, до тех пор, пока существует язык. Кажется абсурдным предполагать, что он когда-либо прекратит свое существование. - person Mark Amery; 01.12.2014
comment
@MarkAmery, хотя его предпосылки не приводят к его заключению, сам вывод верен: ~ Назовите меня параноиком, но в будущем может не быть exit. Или может не быть die в будущем - person Pacerier; 30.06.2015
comment
@Pacerier Совершенно верно. Возможно, в будущем PHP не будет, так что давайте все бросим это занятие по программированию и станем гробовщиками или сборщиками налогов. В конце концов, нет ничего определенного, кроме смерти и налогов. - person Mark Amery; 30.06.2015
comment
@MarkAmery, Никакого PHP в будущем кажется чрезмерным параноиком. История показала, что безумно популярные языки не умирают так легко (Фортран!). - person Pacerier; 02.07.2015
comment
Не будь параноиком. exit никогда не умрет. :) - person dolmen; 24.01.2018

По сути, они одинаковы, хотя эта статья предполагаем иначе.

person o.k.w    schedule 25.11.2009
comment
Эта статья просто странная; из определения сканера можно сказать, что они эквивалентны; если есть разница, возможно, тест был запущен без opcache. - person Ja͢ck; 25.11.2014
comment
Статья посвящена тесту, который невозможно воспроизвести, поскольку код не опубликован. Просто не обращай на это внимания. - person dolmen; 24.01.2018

Функционально они идентичны. Так что выбирать, какой из них использовать, полностью личное предпочтение. Семантически в английском они разные. Die звучит отрицательно. Когда у меня есть функция, которая возвращает данные JSON клиенту и завершает программу, это может быть ужасно, если я вызываю эту функцию jsonDie (), и более уместно называть ее jsonExit (). По этой причине я всегда использую exit вместо die.

person Luo Jiong Hui    schedule 20.06.2016
comment
OP спрашивает только о функциях выхода PHP и die. - person Black Mamba; 02.03.2017
comment
Да, и я отвечал только на этот вопрос. Однако следует знать, что вопрос не только в функциональной разнице. - person Luo Jiong Hui; 02.03.2017
comment
Одна из моих самых прекрасных функций называется pd (), что означает «Пожалуйста, умри». Так что я не уверен, что die - это плохо в таком контексте :) - person Ivan Ponomarev; 06.01.2018
comment
Как разработчик полного стека, я вижу себя не только программистом, но и дизайнером пользовательского опыта. И в этом контексте важна симпатия. Сочувствие влияет не только на то, как я проектирую пользовательский интерфейс, но и на то, как я кодирую. - person Luo Jiong Hui; 08.01.2018

Насколько я знаю, когда смотрю на этот вопрос, здесь

Там сказано, что «в PHP существует явная разница в выводе заголовка. В приведенных ниже примерах я решил использовать другой заголовок, но для того, чтобы показать разницу между exit () и die (), которая не имеет значения», и проверено (лично)

person Dhiva Banyu Wigara    schedule 31.07.2018

Результат функции exit () и функции die () всегда одинаков. Но, как объясняется на странице руководства по псевдониму (http://php.net/manual/en/aliases.php), в нем говорится, что функция die () вызывает функцию выхода. Я думаю, что это жестко запрограммировано, как показано ниже:

function die($msg){
  exit($msg);
}

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

Но очень многие люди не думают, что это проблема, потому что, если у вас столько процессов, вы должны думать о большем количестве проблем, чем если бы функция была главной или псевдонимом.

Но точный ответ таков; allways master работает быстрее, чем псевдоним.

Наконец-то; На странице руководства Alias ​​ говорится, что вы больше не можете использовать die. Это всего лишь псевдоним, и он устарел.

Обычно использование таких псевдонимов - плохая идея, так как они могут быть устаревшими или переименованными, что приведет к непереносимости скрипта. Этот список предназначен для тех, кто хочет обновить свои старые сценарии до более нового синтаксиса.

person MERT DOĞAN    schedule 17.01.2018
comment
Псевдонимы - это не «вызов функции». Проверьте свои предположения, прежде чем выдвигать гипотезу. - person dolmen; 24.01.2018
comment
@dolmen Псевдонимы всегда вызывают основные функции в жестких кодах. Это общее правило программирования. - person MERT DOĞAN; 25.01.2018
comment
@ MERTDOĞAN Псевдоним ничего не вызывает. Псевдоним (в программировании или в реальной жизни) - это просто другое имя объекта (у которого уже есть имя). die() не является отдельной функцией. Это просто еще одно название exit(). Этот ответ содержит неверные утверждения о псевдонимах и их производительности. - person axiac; 15.03.2018
comment
docs.php.net/manual/ ru / Всегда называются псевдонимами, как в примере выше. Узнай что-нибудь и возвращайся. - person MERT DOĞAN; 16.03.2018

Что-то, что я заметил в своих сценариях, по крайней мере, заключается в том, что exit () остановит текущий выполняющийся сценарий и передаст управление любому вызывающему сценарию, в то время как die остановит php на своем пути. Я бы сказал, что это довольно большая разница?

person noowie    schedule 27.07.2017
comment
@AdarshMadrecha, это неправда. Если они находятся внутри или вне подфункции, скрипт php всегда останавливается. - person MERT DOĞAN; 17.02.2018

Они звучат примерно одинаково, однако exit () также позволяет вам установить код выхода вашего PHP-скрипта.

Обычно вам это не нужно, но при написании консольных скриптов PHP вы можете проверить, например, с помощью Bash, все ли скрипт завершил правильно.

Затем вы можете использовать exit () и поймать это позже. Однако Die () этого не поддерживает.

Die () всегда существует с кодом 0. Таким образом, команда die () выполняет следующие действия:

<?php
echo "I am going to die";
exit(0);
?>

Это то же самое, что:

<?php
die("I am going to die");
?>
person Icheb    schedule 25.11.2009
comment
Это не правда. die и exit идентичны (они производят один и тот же токен парсера (T_EXIT) и выполняются одним и тем же кодом). Если параметр является целым числом, он вернет этот код в оболочку. Если это не так, он выведет его и вернет 0. Таким образом, die и exit буквально являются псевдонимами друг для друга. - person ircmaxell; 29.04.2011
comment
хорошо, если вы знаете, что можете использовать exit (я выхожу ...); - person Yuda Prawira; 11.04.2013
comment
На данный момент 23 положительных голоса за просто ложный ответ! Вот почему я никогда не голосую за ответы, пока не прочту все конкурирующие ответы на вопрос и не пойму их все (за исключением ужасно написанных, которые я не могу понять). - person Mark Amery; 01.12.2014
comment
Именно об этом пишет @GeoffreyHale в своем ответе. То, что вы опубликовали в качестве ответа, - это то, что можно было бы ожидать, исходя из таких языков, как Perl или C. Но, как отмечали другие, это неверно для php. Вы действительно можете подумать о том, чтобы отредактировать свой ответ, чтобы отразить это, или удалить его в противном случае. - person Levite; 07.04.2015