exit, exit (), exit (0), die (), die (0) - Як вийти зі сценарію


81

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

РЕДАГУВАТИ: Усі відповіді мають " die()і exit()однакові", хоча я кажу це у своєму питанні. Я оновився до заголовка, щоб, мабуть, було зрозуміліше, що це НЕ моє питання. Я хочу чітко вказати на успіх за допомогою сценарію командного рядка.


4
Я вважаю, що вони ідентичні stackoverflow.com/questions/1795025/…
Дуг Овінгс

не використовуйте жодного з них ... просто використовуйте комбінацію ехо та повернення.

2
@HiroProtagonist повністю не згоден; returnмає інше значення
Вибухові таблетки

Відповіді:


67

Всі вони однакові. Я майже впевнений, що die()це просто прямий псевдонім exit(), але навіть якщо це не так, він все одно діє ідентично.

Коли одній із цих функцій надається аргумент рядка, вона виводить рядок перед завершенням процесу. Коли воно зустрічає ціле число менше 255, це ціле число вважається кодом повернення процесу, який повертається назад до процесу, який викликав PHP-скрипт. Це особливо корисно при написанні програм командного рядка (PHP - це не лише Інтернет!).

Що стосується різниці між exit, exit()і exit(0), там дійсно немає. Безумовно, немає різниці між першими двома, оскільки exitтехнічно це мовна конструкція, а не функція, тому її можна викликати з дужками або без них, як і echo. Повертаючи код 0засобу "ця програма працювала успішно / без помилок", і хоча я не знаю, що саме відбувається, коли ви не передаєте аргумент, PHP.net каже, що аргумент без аргументів exitвказує на успіх, тому я б поставив заклад він повертається 0, хоча знову ж PHP.net не відображає значення за замовчуванням для аргументу.


3
exit(0)означає вихід із успіхом, exit(1)означає вихід із невдачею.
Yousha Aleayoub

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 із зазначенням помилок.


Я розумію умови невдач, але хочу правильно вказати успіх.
Вибухові таблетки

Зазвичай взаємодія на основі браузера просто вмирає (). Для використання php в командному рядку, померти (0).
nsanders

Варто згадати ... die () сам по собі не вказує на стан помилки. Це просто зупиняє виконання PHP-сценарію.
nsanders

+1, згадуючи командний рядок, занадто багато людей забувають про командний рядок php
Джон Магнолія

@JohnMagnolia: Але потім він забув про те саме одразу внизу, сказавши "буде відображатися в браузері, коли відбудеться вихід". ;) (Звичайно, це також відображається на консолі CLI.)
Sz.

5

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

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

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

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


1

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

Стандартним способом є використання нульового коду виходу для позначення успіху, а будь-що інше для позначення стану помилки.


1

die () зазвичай використовується для знищення сценарію з виведенням помилки:

die("There was a fatal error");

де-як вихід зазвичай використовується як успішний вихід (принаймні в моєму кодуванні)

У посібнику PHP сказано, що функції ідентичні.


1

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

Тут мета полягає у тому, щоб уникнути здійснення дзвінків api до окремого файлу точки вручення. Скажімо, у моєму інтерфейсі є гарна кнопка відтворення, яка виконує системні дзвінки.

Приклад 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, іноді слід вважати - як найкраще зробити to -!

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

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


0

dieточно еквівалентно exit.

З посібника :

Якщо статус - ціле число, це значення буде використовуватися як статус виходу.

Це корисно, лише якщо у вас є якась обгортка, яка робить щось на основі статусу виходу. Якщо у вас немає особливої ​​потреби повідомити про вихідний код зовнішньому світу, просто exit;.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.