Каковы различия в die () и exit () в PHP?


678

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

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


2
exit () просто выводит программу с числовым статусом выхода, а die () выводит сообщение об ошибке в stderr и выходит со статусом EXIT_FAILURE. so exit() is exit and die() is also exit :)
Мухаммед Шахзад

Ответы:


541

Там нет разницы - они одинаковы.

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

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

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

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


17
псевдонимы позволяют программистам использовать тот, который удобен для. Я помню выход лучше, чем умереть. Некоторые помнят, что умирают лучше, чем выход.
Mauris

28
это ( php.net/manual/en/aliases.php ) может дать некоторое объяснение, почему 2 функции делают одно и то же
Марек Карбарз

87
Несмотря на то, что они делают то же самое, я обычно резервирую dieдля остановок, связанных с ошибками, и exitдля всех других сценариев. Кажется, что при чтении кода это выглядит лучше.
nextgentech

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

7
@mauris, лучше для одной функции иметь только одно имя . Представьте, что у каждой PHP-функции есть два имени, это было бы полным беспорядком .
Pacerier

222

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

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


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

die()и exit()являются эквивалентными функциями.

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

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

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

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

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

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

die псевдоним для основной функции exit()


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

die()и exit()имеют разные на других языках , но в PHP они идентичны.

Из еще одной PHP-разглагольствования :

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

В PHP exit () и die () идентичны.

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

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

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


14
Несмотря на то, что речь идет о 100-м ответе о том, что они эквивалентны (как также видно из моего ответа ^^), это действительно добавляет ОЧЕНЬ хорошие плюсы. Больше всего то, что они НЕ одинаковы в других языках (таким образом, путаница в первую очередь). (+1)
Левит

@ Левит, нет, нет, вы все неправильно поняли . Никто не владеет именами, а разные языки используют одни и те же имена неравным образом. Это хорошо, потому что нам не нужен еще один стандартный способ работы. «Путаница в первую очередь» происходит из-за того, что PHP назначает два разных имени одной функции ..
Pacerier

2
@Pacerier: Конечно, если вы посмотрите на это с точки зрения «кто виноват», это абсолютно правильно. Тем не менее это также факт, что они просто означают разные вещи на нескольких языках (что нормально). Глядя на это с нейтральной точки зрения, это определенно верно: существует путаница из-за различных значений (даже если это ошибка php в создании двух одинаковых псевдонимов функций). Я определенно не хотел показывать пальцем ни на один из этих языков, если это было то, что вы поняли из моего комментария ... (отлично xkcd кстати (Y) ^^)
Левит

2
Это обязательно должен быть выбранный ответ, хорошее описание!
Коди Браун

Другой пользователь ответил, что exit()не закрывает соединение, а закрывает die(), кажется актуальным.
ner0

62

Как указано выше, эти две команды создают один и тот же токен синтаксического анализатора.

НО

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

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

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


4
@ Timeless, Перфекционисты не сказали бы: «PHP - интерпретируемый язык». PHP - это язык, который можно интерпретировать или компилировать в зависимости от настроек вашего сервера.
Pacerier

29
И ... "die" имеет длину 3 символа против 4 для "exit". Так что это занимает на 25% меньше памяти и файлового пространства! ;)
Ян Дерк

2
'' если это длинный список функций, начинающихся с "d", и более короткий список, начинающийся с "e", то при поиске имени функции для функций, начинающихся с "e" ', должно быть затрачено время. означают , что штрафное время будет происходить при поиске функции , начиная с г Как правило, чем больше список, тем больше времени , чтобы найти пункт в этом.
Pere

9
Как вы писали, вы не изучали парсер PHP. Спасибо за этот бесполезный ответ, поскольку он основан на ваших мечтах о том, как реализован PHP.
дольмен

44

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

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

Вы даже можете сделать die;то же самое, что и exit;- с паренсом или без него.

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


1
это также делает удобным, когда кто-то пришел с другого языка, если они каким-либо образом
знакомы

обратите внимание , что при работе PHP в интерактивном режиме ( php -a) die;, die();, exit;и exit();не имеет никакого эффекта, в то время как exit(без запятой) выходит в интерактивном режиме.
Сантьяго Аристи

31

Как и все другие правильные ответы говорит, 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там, где это не соответствует моим правилам ...


30

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

die():

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

exit():

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

Результаты:

exit():

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

die():

HTTP/1.1 304 Not Modified 
Connection: close

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

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


1
Это должен быть принятый ответ.
ner0

2
Только что проверил exitи dieработаю одинаково, они оба закрывают связь.
Гжегож Адам Ковальски

12

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

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

например die( 'Oops! Something went wrong' );

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

например exit( 'Request has been processed successfully!' );


11

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

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

Итак, назовите меня параноиком, но dieв будущем этого может и не быть .


3
Он также говорит, что в некоторых случаях нет предпочтительного имени среди нескольких, is_int()и is_integer()одинаково хороши, например. Глядя на php-srcисторию коммитов на GitHub, die()конструкция была в PHP по крайней мере с 1999 года, когда она была преобразована в репозиторий SVN, и, вероятно, до тех пор, пока существует язык. Кажется абсурдом представить, что это когда-либо будет осуждается.
Марк Амери

2
@MarkAmery, в то время как его предпосылки не приводят к его заключению, сам вывод верен: ~ "Назовите меня параноиком, но exitв будущем его может и не быть. Или не может быть dieв будущем"
Pacerier

@Pacerier Совершенно верно. В будущем, возможно, не будет PHP, поэтому давайте все бросим эту программу и станем гробовщиками или сборщиками налогов. В конце концов, нет ничего, кроме смерти и налогов.
Марк Амери

@MarkAmery, «Нет PHP в будущем», похоже, выше среднего параноика. История показала, что безумно популярные языки не так легко отмирают (Фортран!).
Pacerier

1
Не будь параноиком. выход никогда не умрет . :)
дольмен


6

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


1
Эта статья просто странная; из определения сканера вы можете сказать, что они эквивалентны; если есть какая-то разница, возможно, тест был выполнен без opcache.
Ja͢ck

Статья посвящена тесту, который невозможно воспроизвести, поскольку код не опубликован. Просто игнорируй это.
дольмен

0

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


ОП спрашивает только о функциях выхода и PHP.
Черная мамба

1
Да, и я отвечал только на этот вопрос. Однако, чтобы знать, вопрос не в разнице только в функциональности.
Ло Цзюн Хуэй

Одна из моих самых любимых функций называется pd () - что означает «Пожалуйста, умри». Так что я не уверен, что умирать - это плохо в таком контексте :)
Иван Пономарев

Как разработчик полного стека, я вижу себя не только программистом, но и дизайнером пользовательского опыта. И в этом контексте симпатия важна. Сочувствие влияет не только на то, как я проектирую пользовательский интерфейс, но и на то, как я пишу код.
Ло Цзюн Хуэй

0

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

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


-3

В викторине w3schools: функции die () и exit () делают одно и то же? мой ответ неверен Это неверный ответ. Правильный ответ верен.

Вот скриншот: введите описание изображения здесь


-5

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


1
@AdarshMadrecha это не правда. Если они находятся внутри или снаружи подфункции, скрипт php всегда останавливается.
MERT DOĞAN

-5

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

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

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

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

Но точный ответ таков; всегда мастер-функция быстрее, чем псевдоним.

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

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


2
Псевдоним не является «вызовом функции». Проверьте свои предположения, прежде чем разрабатывать гипотезу.
дольмен

@dolmen Aliases всегда вызывает основные функции в жестких кодах. Это общее правило программирования.
MERT DOĞAN

@ MERTDOĞAN Псевдоним ничего не вызывает. Псевдоним (в программировании или в реальной жизни) - это просто другое имя объекта (у которого уже есть имя). die()это не отдельная функция. Это просто другое имя exit(). Этот ответ содержит неверные утверждения о псевдонимах и их производительности.
Аксиак

docs.php.net/manual/en/… Псевдонимы всегда называются так же, как в примере выше. Узнай что-нибудь и возвращайся.
MERT DOĞAN

-10

Они звучат примерно одинаково, однако 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");
?>

42
Это не правда. dieи exitидентичны (они производят один и тот же токен парсера ( T_EXIT) и выполняются одним и тем же кодом). Если параметр является целым числом, он вернет этот код в оболочку. Если это не так, он выведет его и вернет 0. Таким образом, dieи exitбуквально псевдонимы друг для друга.
ircmaxell

6
хорошо, если вы знаете, что вы можете использовать выход ("Я выхожу ...");
Юда Prawira

4
23 ответа пока что за ответ, который просто ложный! Вот почему я никогда не голосую за ответы, пока не прочту все конкурирующие ответы на вопрос и не пойму их все (за исключением ужасно написанных, которые я не могу понять).
Марк Амери

3
Именно об этом @GeoffreyHale пишет в своем ответе. То, что вы разместили в качестве ответа, - это то, что можно ожидать от такого языка, как Perl или C. Но, как упоминали другие, это не относится к php. Вы действительно можете изменить свой ответ, чтобы отразить это, или удалить его в противном случае.
Левит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.