Які відмінності у die () та exit () у PHP?


679

У чому полягають відмінності 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 функції роблять те саме
Marek Karbarz

86
Незважаючи на те, що вони роблять те саме, я зазвичай резервую dieдля зупинок, пов'язаних з помилками, та exitдля всіх інших сценаріїв. Це, здається, протікає краще при читанні коду.
nextgentech

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

7
@mauris, Для однієї функції краще мати лише одне ім’я . Уявіть, що кожна функція PHP має два імені, це було б повним безладом .
Pacerier

221

Різниця в походженнях

Різниця між PHP 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 вихід () та die () ідентичні.

Дизайнери, очевидно, думали, "Хм, давайте запозичимо вихід () від C. І людям Перла, мабуть, сподобається, якщо ми візьмемо die (), як і від Perl . На жаль, у нас є дві функції виходу! Давайте зробимо так, щоб вони обидва може взяти рядок або ціле число як аргумент і зробити їх однаковими! "

Кінцевий результат полягає в тому, що це насправді не робило речі «простішими», а ще більш заплутаними. Кодери C і Perl продовжуватимуть використовувати exit () для підкидання лише цілого значення виходу, а die () для підкидання повідомлення про помилку та виходу з відмовою. Новачки та люди на першому мові PHP, мабуть, зададуться питанням "гмм, дві функції виходу, яку я повинен використовувати?" Посібник не пояснює, чому існує вихід () та die ().

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


14
Незважаючи на те, що мова йде про 100-ту відповідь, вказуючи, що вони є рівнозначними (як це також видно у моїй відповіді ^^), це дійсно додає ДУЖЕ хороших балів. Найбільше, що вони НЕ однакові в інших мовах (таким чином, плутанина в першу чергу). (+1)
Левіт

@Levit, Ні, ні, ти розумієш це абсолютно неправильно . Ніхто не володіє іменами та різними мовами повторно використовує ті самі імена нерівними способами. Це добре, тому що нам не потрібен ще один стандартний спосіб робити. "Плутанина в першу чергу" пояснюється тим, що PHP присвоює одній функції два різних імені .
Pacerier

2
@Pacerier: Звичайно, якщо ви дивитесь на це з точки зору "хто винен", це абсолютно правильно. Однак факт також є в тому, що вони просто означають різні речі кількома мовами (що нормально). Дивлячись на це з нейтральної точки зору, це безумовно справедливо: Існує плутанина через різні значення (навіть якщо винна php у створенні двох рівних псевдонімів функції). Я, безумовно, не хотів вказувати пальцем на якусь із цих мов, якщо це було те, що ви зрозуміли з мого коментаря ... (великий xkcd btw (Y) ^^)
Левіт

2
Це обов'язково повинна бути обрана відповідь, хороший опис!
Коді Браун

Інший користувач відповів, що exit()не перериває з'єднання, але die()це здається релевантним.
ner0

62

Як було сказано раніше, ці дві команди виробляють однаковий маркер синтаксичного аналізу.

АЛЕ

Існує невелика різниця, і саме стільки часу потрібно, щоб парсер повернув маркер.

Я не вивчав PHP-аналізатор, але якщо це довгий список функцій, що починається з "d", і коротший список, що починається з "e", тоді має бути покарання часу, яке шукає назву функції для функцій, що починаються з " е ". І можуть бути інші відмінності через те, як перевіряється ім'я всієї функції.

Я сумніваюся, що це буде вимірним, якщо у вас немає "ідеального" середовища, присвяченого розбору PHP, і багато запитів з різними параметрами. Але має бути різниця, адже PHP - це інтерпретована мова.


4
@Timeless, Perfectionists не сказали б "PHP - це інтерпретована мова". PHP - це мова, яку можна інтерпретувати або компілювати залежно від налаштування вашого сервера.
Pacerier

29
І ... "die" - 3 символи та 4 для "exit". Таким чином, це займає 25% менше пам'яті та файлового простору! ;)
Ян Дерк

2
"" якщо це довгий перелік функцій, що починається з "d", і коротший список, що починається з "e", тоді має бути покарання часу, яке шукає назву функції для функцій, що починаються з "e" ". означає, що покарання за час відбуватиметься при пошуку функції, що починається з d ? Зазвичай, чим більший список, тим довший час для пошуку предмета в ньому.
Пер

9
Як ви писали, ви не вивчали парсер PHP. Дякуємо за цю марну відповідь, оскільки вона заснована на ваших мріях щодо того, як реалізується PHP.
долмен

44

Посібник для PHP на матриці :

die - еквівалент виходу

Ви можете зробити die;так само, як і exit;з паронами або без них.

Єдина перевага вибору die()більш exit(), може бути час ви заощадити на введенні додаткового листа ;-)


1
це також полегшить, коли хтось приїхав з іншої мови, чи знайомиться вони якось із способів
Рохан Худе

зверніть увагу , що при роботі PHP в інтерактивному режимі ( php -a) die;, die();, exit;і exit();не має ніякого ефекту, в той час як exit(без коми) виходить в інтерактивному режимі.
santiago arizti

31

Як говорять всі інші правильні відповіді, dieі exitце однакові / псевдоніми.

Хоча я маю особисту умову, що коли я хочу закінчити виконання сценарію, коли це очікується та бажано, я використовую exit;. І коли мені потрібно закінчити виконання через деякі проблеми (не вдалося підключитися до db, не можу записати у файл тощо), я використовую 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 у майбутньому", схоже, параноїд вище середнього. Історія показала, що шалено популярні мови не вмирають так легко (Fortran!).
Pacerier

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


6

Вони по суті однакові, хоча ця стаття пропонує інше.


1
Ця стаття просто дивна; з визначення сканера ви можете сказати, що вони еквівалентні; якщо є якась різниця, можливо, тест проводився без запуску.
Ja͢ck

У статті йдеться про орієнтир, який неможливо відтворити, оскільки код не публікується. Просто ігноруйте це.
долмен

0

Функціонально вони однакові. Тож вибрати, який саме використовувати, - це цілком особиста перевага. Семантично в англійській мові вони різні. Вмирання звучить негативно. Коли у мене є функція, яка повертає дані клієнта JSON клієнту і закінчує програму, це може бути жахливо, якщо я називаю цю функцію jsonDie (), і більш доцільно називати її jsonExit (). З цієї причини я завжди використовую вихід замість die.


ОП запитує лише про вихід PHP та функції вимкнення.
Чорна мамба

1
Так, і я відповідав лише на це питання. Але, маючи на увазі, питання не в різниці лише у функціональності.
Luo Jiong Hui

Одна з найкрасивіших моїх функцій називається pd () - Що означає Please Die. Тож я не впевнений, що померти - це погано в такому контексті :)
Іван Пономарьов

Як повноправний розробник стеків, я бачу себе не лише програмістом, але і дизайнером User Experience. І в цьому контексті важлива симпатія. Симпатія не тільки впливає на те, як я створюю інтерфейс користувача, але і на те, як я кодую.
Luo Jiong Hui

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);
}

Це не проблема ефективності для малих, середніх та великих проектів, але якщо проект має мільярди, примножують мільярди, примножують мільярдні процеси, це відбувається дуже важливим для оптимізації ефективності.

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

Але точна відповідь така: завжди головна функція швидше, ніж псевдонім.

Нарешті; Сторінка керівництва псевдоніму говорить, що ви більше не можете використовувати функцію die. Це лише псевдонім, і він застарів.

Зазвичай це погана ідея використовувати такі псевдоніми, оскільки вони можуть бути пов'язані з застарінням або перейменуванням, що призведе до невідповідного сценарію. Цей список надається, щоб допомогти тим, хто хоче оновити свої старі сценарії до новішого синтаксису.


2
Згладжування не є "викликом функції". Перевірте свої припущення перед тим, як розробити гіпотезу.
долмен

@dolmen Aliases завжди називає основні функції у жорстких кодах. Це загальне правило програмування.
MERT DOĞAN

@ MERTDOĞAN Псевдонім нічого не дзвонить. Псевдонім (в програмуванні або в реальному житті) - це лише інша назва об'єкта (у якого вже є назва). die()не є окремою функцією. Це просто інша назва exit(). Ця відповідь містить неправильні твердження про псевдоніми та їх виконання.
аксіак

docs.php.net/manual/en/… Псевдонім завжди називає, як описано вище. Дізнайтеся щось і поверніться.
MERT DOĞAN

-10

Вони звучать приблизно однаково, однак, вихід () також дозволяє встановити вихідний код сценарію 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
добре, якщо ви знаєте, що можете використовувати exit ("Я виходжу ...");
Yuda Prawira

4
Наразі 23 оновлень за відповідь, яка просто помилкова! Ось чому я ніколи не голосую за відповіді, доки я не прочитав усі суперечливі відповіді на питання і не зрозумію їх усіх (забороняючи страшенно написані, я не можу мати жодного сенсу).
Марк Амері

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