php - Чи слід викликати exit () після виклику заголовка Location:?


76

Після виклику заголовка функції переадресації, слід викликати exit чи ні?

<?php // fileA
$urlFailToGoTo = '/formerror.php';

if (sth)
{
   header(sprintf("Location: %s", $urlFailToGoTo));
   exit(); //should I call exit() here? or return?
}

?>

Дякую


Відповіді:


81

Ви точно повинні. В іншому випадку виконання сценарію не припиняється. Встановлення іншого заголовка поодинці недостатньо для переспрямування.


Привіт, Олівере, чи вихід припиняє виконання сценарію в bivšem.php? Я думаю, що моє запитання полягає в тому, коли я називаю "вихід" після "заголовка". який скрипт впливає і більше не буде виконуватися? Дякую
q0987

2
exit завжди перериває поточний скрипт (у вашому випадку "fileA"). Сторінка, на яку Ви переспрямовуєте ("/formerror.php"), це ніяк не впливає. Переспрямування повідомляє вашому браузеру ініціювати новий HTTP-запит до місця, яке ви вказали в "Розташування". По суті це те саме, що натиснути вручну посилання на "formerror.php".
rgroli

Тож вихід в основному призначений лише для сервера, тож він більше не робитиме зайвої роботи?
Gust van de Wal

32

Ви повинні, як пояснює @rgroli. Якщо ви не хочете турбуватись дужками, ви також можете зателефонувати header() IN exit() :

if(sth) exit(header("Location: http://example.com"));

Заголовок розташування в HTTP / 1.1 завжди вимагає абсолютного шляху, див. Примітку тут .

Примітка: Це не хакерство, оскільки код виходу використовується лише в тому випадку, якщо параметр є цілим числом, тоді як створюється header()void (він виходить з кодом = 0, звичайний вихід). Подивіться на це як на exit_header()функцію, як це має бути після Locationзаголовка.


1
Гадаю, ви мали на увазі header В exit() ? ;)
yckart

Чи не означає це, що ви передаєте вихідні дані headerяк вихідний код exit? Хіба це не було б небажаним?
ADTC

@ADTC header()у PHP повертає void і код виходу використовується лише в тому випадку, якщо параметр є цілим числом. У цьому випадку він просто зупиняє генерацію коду безшумно (маючи на увазі вихідний код = 0, звичайний вихід).
Ян Туров,

20

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


8

Якщо у вас немає коду (PHP або HTML) під заголовком, вам цього не потрібно.


Привіт, aromawebdesign.com, у мене є код у formerror.php. Це проблема? Дякую
q0987

якщо у вас є який-небудь код після виклику заголовка, вам слід зателефонувати die (); або вихід ();
Hydrino

4

вихід - погане кодування.

якщо ви коли-небудь розробляєте великий проект і хочете створити PHP Unit Testsases, вихід вас зіпсує.

вихід припиняє роботу скрипта і ваш запущений тест! немає можливості відновити тест і визначити, чи він провалився чи ні ...

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


4
Я думаю, це помилка програмного забезпечення для тестування, якщо воно не може виділити тестовий сценарій, який тестує. Це як вимкнення комп’ютера, оскільки сценарій оболонки завершується за допомогою exitкоманди.
ADTC

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

5
Я не уявляю, що ви говорите:/
ADTC

1
@Umingo Хіба це не сама мета exitвиклику (або також breakусередині функції / методу)? Не тільки в PHP, але майже в усіх відомих мовах програмування?
Девід Табернеро М.,

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