ThinkPHP 模板引擎的 <if> 標籤提供強大的條件判斷能力,支援複雜邏輯組合、PHP 函數調用、變數屬性存取(點語法/對象語法),是模板中實現動態顯示的關鍵。但濫用會導致模板邏輯過重、難以維護,本文將系統梳理語法、運算子、進階用法與最佳實踐。
<if condition="判斷條件">
條件成立輸出內容
<elseif condition="另一條件" />
另一條件成立輸出
<else />
以上都不成立輸出
</if>
condition 屬性內為類 PHP 表達式,但禁止直接使用 > < 符號(會干擾 XML 解析),必須使用字母運算子。<elseif> 和 <else> 為單標籤(以 /> 結尾)。| 運算子 | 含義 | PHP 對應 | 範例 |
|---|---|---|---|
eq / equal | 等於 | == | condition="$status eq 1" |
neq / notequal | 不等於 | != | condition="$status neq 0" |
gt | 大於 | > | condition="$age gt 18" |
egt | 大於等於 | >= | condition="$score egt 60" |
lt | 小於 | < | condition="$stock lt 10" |
elt | 小於等於 | <= | condition="$num elt 100" |
heq | 恆等於(型別也相同) | === | condition="$type heq 'admin'" |
nheq | 不恆等於 | !== | condition="$val nheq false" |
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
<if condition="$a > 5"> | > 被解析為標籤結束 | <if condition="$a gt 5"> |
<if condition="$a == $b"> | == 不支援 | <if condition="$a eq $b"> |
<if condition="isset($var)"> | 未在白名單 | 用 <present name="var"> 或配置 TMPL_ALLOW_PHP_FUNCS |
<if condition="$obj->method()"> | 不支援方法呼叫 | 控制器預先計算好傳模板 |
| 過度嵌套 5+ 層 IF | 模板邏輯過重,難維護 | 重構到控制器或使用 Switch/比較標籤 |
<div class="product-card">
<h3>{$goods.name}</h3>
<!-- 價格顯示 -->
<if condition="$goods.promote_price gt 0">
<span class="promote-price">¥{$goods.promote_price}</span>
<del>¥{$goods.shop_price}</del>
<else />
<span class="normal-price">¥{$goods.shop_price}</span>
</if>
<!-- 庫存狀態 -->
<switch name="goods.stock">
<case value="0"><span class="out-of-stock">缺貨</span></case>
<case value="1|2|3|4|5"><span class="low-stock">庫存緊張 (剩 {$goods.stock})</span></case>
<default /><span class="in-stock">有貨</span>
</switch>
<!-- VIP 專屬 -->
<if condition="$Think.session.user.vip_level egt 3 AND $goods.is_vip_exclusive">
<span class="vip-tag">VIP 專享</span>
</if>
</div>
$show_vip_tag)。<eq>/<gt>,編譯後為簡單 if,比 <if> 快。'TMPL_CACHE_ON' => true,編譯後為 PHP 檔案,運行時無解析開銷。ThinkPHP <if> 標籤功能強大,支援類 PHP 表達式、函數調用、多種變數語法、邏輯組合。但「能用 IF 不代表都該用 IF」——遵循「比較標籤 > Switch > IF > 原生 PHP」的選擇原則,將業務邏輯沉澱到控制器/服務層,模板專注於展示,才能構建清晰、可維護、高效能的視圖層。