<?php
require_once('./bb-load.php');
bb_repermalink();
if ($self) {
if (strpos($self, '.php') !== false) {
require($self);
} else {
require(BB_PATH . 'profile-base.php');
}
return; // <-- 這裡不在任何函數裡!
}
「如果在全域範圍中呼叫
return語句,則當前腳本檔案中止運行。」
這與 C、Java 等語言截然不同:在這些語言中,return 僅能出現在函數/方法內。
| 語境 | PHP 行為 | C / Java 行為 |
|---|---|---|
| 函數內 | 結束函數、回傳值 | 結束函數、回傳值 |
| include/require 的檔案內 | 結束被引入檔案,回到引入處繼續;可回傳值給 include 表達式 | N/A |
| 主腳本(非 include)全域 | 終止整個腳本執行(等同 exit) | 編譯錯誤 |
<?php // index.php
$action = $_GET['a'] ?? 'home';
switch ($action) {
case 'home':
require 'home.php';
return; // 結束 index.php,不再往下執行
case 'api':
require 'api.php';
return;
case 'admin':
if (!isAdmin()) {
http_response_code(403);
echo 'Forbidden';
return;
}
require 'admin.php';
return;
}
echo '404 Not Found';
<?php // install.php
if (version_compare(PHP_VERSION, '7.4', '<')) {
die('需要 PHP 7.4+');
}
if (!extension_loaded('pdo_mysql')) {
die('缺少 pdo_mysql 擴展');
}
// 通過驗證,繼續執行安裝邏輯...
此處用 die()/exit 更直觀,但 return 在 include 時可讓呼叫端捕獲回傳值。
<?php // config.php
return [
'db' => ['host' => 'localhost', 'name' => 'app'],
'debug' => true,
];
// 若直接瀏覽此檔,return 會終止輸出,不會洩露配置
include B,B 用 return,A 會繼續執行。$config = include 'config.php'; 取得陣列。exit 或結構化控制流,語意更清晰。PHP 允許在全域範圍使用 return 終止腳本,這是語言層面的特性,常見於早期框架(如 bbPress、WordPress 早期)的路由分發。現代開發建議採用前端控制器模式(單一 index.php + 路由元件),以利維護與測試。