goto 是 PHP 5.3 引入的流程控制操作符,允許跳轉到同一檔案、同一作用域內的標籤位置。雖然濫用會降低可讀性,但在「跳出多層巢狀迴圈」等特定場景下可簡化邏輯,替代多層 break。
<?php
goto a;
echo '這行不會執行';
a:
echo '直接輸出這行'; // 輸出:直接輸出這行
?>
| 場景 | 是否允許 | 說明 |
|---|---|---|
| 同檔案、同作用域跳轉 | ✅ | 標籤格式 label: |
| 跳入函數/類方法內部 | ❌ | Fatal error |
| 跳出函數/類方法 | ❌ | Fatal error |
跳入 for/while/foreach/switch 區塊 | ❌ | Fatal error: 'goto' into loop or switch statement is disallowed |
| 跳出迴圈/switch | ✅ | 常見合法用途 |
<?php
for ($i = 0, $j = 50; $i < 100; $i++) {
while ($j--) {
if ($j == 17) goto end; // 直接跳出雙層迴圈
}
}
echo "i = $i"; // 不會執行
end:
echo 'j hit 17'; // 輸出:j hit 17
?>
<?php
goto loop;
for ($i = 0, $j = 50; $i < 100; $i++) {
while ($j--) {
loop: // 錯誤:嘗試跳入迴圈內部
}
}
echo "$i = $i";
// Fatal error: 'goto' into loop or switch statement is disallowed
?>
end_loop:、cleanup: 而非單字母結論:goto 不是萬惡之源,但也是萬能藥。理解其作用域限制,在「跳出多層迴圈」這一合法場景謹慎使用,其餘情況請擁抱結構化程式設計。