<?php
goto label;
echo '這行不會執行';
label:
echo '跳轉到這裡'; // 輸出:跳轉到這裡
標簽區分大小寫,以冒號結尾,同一作用域內唯一。
| 限制 | 說明 | 錯誤示例 |
|---|---|---|
| 不能跨文件 | 標簽必須在同一 PHP 文件 | goto label; 在 a.php,label: 在 b.php |
| 不能跨函數/方法 | 不能跳入/跳出函數 | 函數外 goto 跳入函數內部標簽 |
| 不能跳入循環/Switch | 目標標簽不能在 for/while/foreach/switch 內部 | goto loop; for(...) { loop: ... } |
| 可以跳出循環/Switch | 從內部跳到外部標簽合法 | for(...) { if($x) goto end; } end: ... |
| 同一作用域 | 不能跳過 try/catch 塊邊界 | catch 塊外 goto 跳入 catch 內部 |
<?php
for ($i = 0; $i < 10; $i++) {
for ($j = 0; $j < 10; $j++) {
if ($i === 5 && $j === 5) {
goto done; // 直接跳出雙層循環
}
}
}
done:
echo "在 ($i, $j) 位置跳出"; // 輸出:在 (5, 5) 位置跳出
<?php
function process($data) {
$fp = fopen('data.txt', 'w');
if (!$fp) goto error;
if (fwrite($fp, $data) === false) goto error_close;
fclose($fp);
return true;
error_close:
fclose($fp);
error:
error_log('Process failed');
return false;
}
<?php
$state = 'START';
$input = 'abc123';
$pos = 0;
start:
if ($pos >= strlen($input)) goto end;
$ch = $input[$pos++];
if (ctype_alpha($ch)) goto alpha;
if (ctype_digit($ch)) goto digit;
goto error;
alpha:
// 處理字母
goto start;
digit:
// 處理數字
goto start;
error:
throw new Exception("Invalid char at $pos");
end:
echo "Parsing complete";
goto。return、異常 throw、標簽 break 2 (PHP 不支持)finally / defer 模式yield / 狀態類 / 正則替換goto 是 PHP 5.3 引入的「核武器級」特性:**知道它存在、理解其限制、極少數情況下謹慎使用、團隊明確禁用規範**。99% 的業務代碼不需要它。