使用 header() 時,後面需要加上 exit() 嗎?

使用 Session 做一個簡單的試驗,先做一個 index.php 頁面

<?php
session_start();

$_SESSION['test'] = 'test';

echo '目前在 index.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';

echo '<hr />';

$_SESSION['test'] = 'hi';

echo '目前在 index.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';
?>

顯示結果為:
目前在 index.php 頁面
session test 的值為: test
—————————
目前在 index.php 頁面
session test 的值為: hi

現在建立另一個頁面 hi.php,讀取 index.php 所建立的頁面

<?php
session_start();
echo '目前在 hi.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';
?>

把原本的 index.php 改為以下

<?php
session_start();

$_SESSION['test'] = 'test';

echo '目前在 index.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';

header('location: hi.php');

echo '<hr />';

$_SESSION['test'] = 'hi';

echo '目前在 index.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';
?>

中間我們指向了 hi.php,看看 PHP 會不會繼續執行 index.php 以下的動作

顯示結果:
目前在 hi.php 頁面
session test 的值為: hi

輸入 index.php 頁面會跳轉到 hi.php,而在 hi.php 中讀取出來的 $_SESSION[‘test’] 為 hi
這表示雖然我們一開始執行 index.php 到 header() 時有跳到指定的頁面,但 index.php 後續的程式碼一樣被執行了

如果現在我們在 index.php 中的 header() 下面加上 exit

<?php

session_start();

$_SESSION['test'] = 'test';

echo '目前在 index.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';

header('location: hi.php');
exit;

echo '<hr />';

$_SESSION['test'] = 'hi';

echo '目前在 index.php 頁面<br />';
echo 'session test 的值為: ' . $_SESSION['test'] . '<br />';

?>

顯示結果:
目前在 hi.php 頁面
session test 的值為: test

可以看到 PHP 並沒有繼續執行 index.php 剩下的程式碼

另外,exit 也可以在中斷執行後輸出一個字串,以下都是正確的用法

exit;
exit();
exit('test');

不過如果是放在 header() 後面使用 exit(‘test’) 是不會出現字串的,因為頁面已經跳轉了

所以最後的結論是:
如果是要中斷程式,並跳轉頁面的話,header() 下一行要加上 exit
如果是跳轉頁面,但仍要執行剩下的程式碼的話,就不要在 header() 下一行加上 exit