在模板渲染中,變數可能未定義、為 null、空字串、空陣列、0、false 等「空值」。直接輸出可能導致版面錯亂、邏輯錯誤、甚至安全隱患。ThinkPHP 提供 <empty> 和 <notempty> 標籤,直接對應 PHP empty() 函數語義,讓模板能優雅處理缺失/空值情況。
<empty> 標籤:值為空時輸出<empty name="變數名"> 要輸出的內容 </empty>
name:模板變數名(不帶 $)。empty():""、0、"0"、null、false、[]、未定義變數 → 均視為「空」。<!-- 控制器未賦值 username 或賦值為 '' -->
<empty name="username"> 用戶名為空 </empty>
<!-- 等效 PHP -->
<?php if (empty($username)) { echo '用戶名為空'; } ?>
<notempty> 標籤:值非空時輸出邏輯互補:
<notempty name="username"> 歡迎,{$username} </notempty>
<?php if (!empty($username)) { echo '歡迎,' . $username; } ?>
<empty> + <else>(推薦)單標籤處理雙分支,最簡潔:
<empty name="username"> 用戶名為空 <else /> 歡迎,{$username} </empty>
<empty name="user.list"> 暫無數據 <else /> {volist name="user.list" id="vo"}...{/volist} </empty>
<empty name="user:profile"> 資料不全 </empty>
支援點語法(自動判斷陣列/對象)、對象語法(:)、系統變數(Think.session.xxx)。
empty(0) 返回 true。若業務中 0 為有效值(如價格 0 元、狀態碼 0),不可直接用 empty/notempty,應改用比較標籤:
<!-- 價格可能為 0 -->
<eq name="price" value="0"> 免費 <else /> ¥{$price} </eq>
<!-- 或 -->
<if condition="isset($price) && $price !== ''">...</if>
isset 與 empty| 場景 | empty($var) | isset($var) (<present>) |
|---|---|---|
| 未定義 | true | false |
| null | true | false |
| '' | true | true |
| 0 | true | true |
| false | true | true |
| [] | true | true |
若需「變數已賦值(含 0/false/'')」判斷,請用 <present>(對應 isset())。
<div class="order-detail">
<h3>訂單號:{$order.sn}</h3>
<!-- 收貨地址 -->
<empty name="order.address">
<p class="text-warning">暫無收貨地址,<a href="{:U('Address/add')}">立即添加</a></p>
<else />
<p>收貨人:{$order.address.consignee}<br>
電話:{$order.address.mobile}<br>
地址:{$order.address.province}{$order.address.city}{$order.address.district}{$order.address.detail}</p>
</empty>
<!-- 優惠券 -->
<empty name="order.coupon">
<span class="text-muted">未使用優惠券</span>
<else />
<span class="badge coupon">已抵扣 ¥{$order.coupon.amount}</span>
</empty>
<!-- 物流狀態 -->
<empty name="order.logistic">
<span class="text-info">待發貨</span>
<else />
<a href="{$order.logistic.query_url}" target="_blank">
{$order.logistic.company} - {$order.logistic.tracking_no}
</a>
</empty>
</div>
,零額外開銷。TMPL_CACHE_ON),運行極快。| 錯誤 | 問題 | 修正 |
|---|---|---|
| 用 empty 判斷價格/數量為 0 | 0 視為空,導致「免費」顯示為「空」 | 用 <eq name="price" value="0"> 或 <present> |
<empty name="$var"> | name 不需 $ | <empty name="var"> |
| 巢狀 empty 縮進混亂 | 難以閱讀 | 提取為子模板 <include> 或重構邏輯 |
<empty>/<notempty> 是模板中處理「缺失/空值」的標準工具,語義對應 PHP empty()。核心要點:記住 0/"0"/false/[] 也視為空,業務有效值為 0 時改用比較標籤;善用 <else> 合並雙分支;結合 <present>(isset 語義)覆蓋所有防禦性判斷場景。將空值處理邏輯封裝在模板中,讓控制器專注於業務數據準備,實現關注點分離。