在 WordPress、Drupal、Laravel Blade 等知名專案的模板檔案中,常見 if ... :、endif;、endforeach; 等寫法。這是 PHP 官方提供的 替代語法,專為「模板檔案中混合 HTML 與 PHP 邏輯」設計。本文系統整理替代語法規則、支援的控制結構、與標準大括號寫法對比、優缺點分析與最佳實踐建議。
| 標準語法 | 替代語法 | 適用結構 |
|---|---|---|
{ | : | if / while / for / foreach / switch |
} | endif; | |
} | endwhile; | |
} | endfor; | |
} | endforeach; | |
} | endswitch; | |
else { | else: | if |
elseif (...) { | elseif (...): | if |
case ...: | case ...: | switch (相同) |
default: | default: | switch (相同) |
<?php if ($user->isAdmin()): ?>
<div class="admin-panel">
管理員專區內容
</div>
<?php elseif ($user->isEditor()): ?>
<div class="editor-tools">
編輯器工具列
</div>
<?php else: ?>
<p>歡迎訪客,請 登入</p>
<?php endif; ?>
等同標準寫法:
<?php if ($user->isAdmin()) { ?>
<div class="admin-panel">...</div>
<?php } elseif ($user->isEditor()) { ?>
<div class="editor-tools">...</div>
<?php } else { ?>
<p>...</p>
<?php } ?>
<ul>
<?php while ($posts->have_posts()): $posts->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<select name="category">
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat->id; ?>"><?php echo $cat->name; ?></option>
<?php endforeach; ?>
</select>
<?php switch ($status): ?>
<?php case 'published': ?>
<span class="badge success">已發布</span>
<?php break; ?>
<?php case 'draft': ?>
<span class="badge warning">草稿</span>
<?php break; ?>
<?php default: ?>
<span class="badge secondary">未知</span>
<?php endswitch; ?>
| 維度 | 替代語法優點 | 替代語法缺點 |
|---|---|---|
| 模板可讀性 | ✅ 結束關鍵字(endif)語意明確,易於在大量 HTML 中配對 | ❌ 非 PHP 開發者(設計師)可能不熟悉 |
| 巢狀結構辨識 | ✅ endforeach 比 } 更易判斷層級 | ❌ 深層巢狀時關鍵字較冗長 |
| 編輯器支援 | ⚠️ 現代 IDE(PhpStorm, VS Code)對大括號配對、摺疊支援更好 | ❌ 部分舊編輯器不支援替代語法高亮/跳轉 |
| 程式碼風格統一 | ❌ 專案若混用兩種風格會顯得混亂 | ✅ 強制統一風格可避免爭論 |
| 效能 | ✅ 編譯後 opcode 完全相同,零差異 | — |
endif、endforeach 明顯優於尋找對應 }。phpcs.xml 或團隊規範中明確定義:「View 層可用替代語法,其餘層禁用」。:/endif 與 {/} 控制同一層級結構。endif、endwhile 等必須以分號結尾(endif;),否則語法錯誤。else:、elseif ($cond):,不能寫 else {。break; 保持不變,不可寫成 break 或 endbreak。PHP 替代語法(: / endif; 等)是為模板層混合 HTML 而設計的語法糖,編譯後與標準大括號零差異。核心原則: View 層用替代語法增強可讀性,邏輯層用標準大括號保持工程規範。團隊應在編碼規範中明確劃分適用邊界,避免風格混亂。