<if condition="...">:模板引擎編譯為 PHP if 語句,受限於 PHP 語法解析器<eq name="..." value="...">:模板引擎自行解析比較邏輯,語法更寬鬆、功能更強// 失敗:$one.group_id 解析為物件屬性存取,非變數 <if condition="$item.group_id eq $one.group_id">...</if> // 成功:eq 標籤原生支援變數對變數 <eq name="item.group_id" value="$one.group_id">...</eq>
關鍵:name 屬性不加 $,value 屬性需加 $。
// 失敗:字串 'NULL' 與 null 混淆 <if condition="name neq 'NULL'">...</if> // 成功:neq 正確識別 null 視為空字串 <neq name="name" value="">...</neq>
// 失敗:編譯器誤判 .0 為浮點數語法 <if condition="name.0 neq 'test'">...</if> // 成功:eq 正確處理數字鍵名 <eq name="name.0" value="test">...</eq>
| 比較需求 | <if> | <eq/neq/gt/lt/heq/nheq> | 建議 |
|---|---|---|---|
| 變數 vs 變數 | ❌ 易失敗 | ✅ 原生支援 | 優先用 eq 系 |
| 變數 vs 常數 | ✅ 正常 | ✅ 正常 | 均可 |
| NULL 判斷 | ❌ 字串比較 | ✅ 語義正確 | 用 neq/eq |
| 數字鍵名 (0,1,2) | ❌ 語法錯誤 | ✅ 正確解析 | 必須用 eq 系 |
| 複雜邏輯 (and/or) | ✅ 原生 PHP | ❌ 單一條件 | 用 if |
<eq>/<neq>/<gt>/<lt>/<heq>/<nheq><if condition="$a gt 1 and $b lt 10"><if condition="isset($var)"> 或 <present name="var">若需特殊比較邏輯(如日期比較),可擴充 Think\Template\TagLib\Cx 類別,註冊新標籤:
// 專案標籤庫擴充
class MyTagLib extends Think\Template\TagLib {
protected $tags = [
'dateeq' => ['attr' => 'name,value,format', 'close' => 1],
];
public function _dateeq($attr, $content) {
$name = $attr['name'];
$value = $attr['value'];
$format = $attr['format'] ?? 'Y-m-d';
$parse = "";
$parse .= $content;
$parse .= "";
return $parse;
}
}
掌握模板標籤的編譯機制與適用邊界,能避免大量難以除錯的模板渲染錯誤。