首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP 模板 empty / notempty 標籤詳解:空值判斷輸出實戰

     編輯:PHP 綜合知識

空值判斷:模板防禦性編程的基石

在模板渲染中,變數可能未定義、為 null、空字串、空陣列、0、false 等「空值」。直接輸出可能導致版面錯亂、邏輯錯誤、甚至安全隱患。ThinkPHP 提供 <empty> 和 <notempty> 標籤,直接對應 PHP empty() 函數語義,讓模板能優雅處理缺失/空值情況。

1. <empty> 標籤:值為空時輸出

語法

<empty name="變數名"> 要輸出的內容 </empty>
  • name:模板變數名(不帶 $)。
  • 判斷邏輯完全等同 PHP empty():""、0、"0"、null、false、[]、未定義變數 → 均視為「空」。

範例

<!-- 控制器未賦值 username 或賦值為 '' -->
<empty name="username"> 用戶名為空 </empty>

<!-- 等效 PHP -->
<?php if (empty($username)) { echo '用戶名為空'; } ?>

2. <notempty> 標籤:值非空時輸出

邏輯互補:

<notempty name="username"> 歡迎,{$username} </notempty>
<?php if (!empty($username)) { echo '歡迎,' . $username; } ?>

3. 合並寫法:<empty> + <else>(推薦)

單標籤處理雙分支,最簡潔:

<empty name="username"> 用戶名為空 <else /> 歡迎,{$username} </empty>

進階用法與細節

1. 陣列/對象判斷

<empty name="user.list"> 暫無數據 <else /> {volist name="user.list" id="vo"}...{/volist} </empty>
<empty name="user:profile"> 資料不全 </empty>

支援點語法(自動判斷陣列/對象)、對象語法(:)、系統變數(Think.session.xxx)。

2. 數值 0 的特殊處理

注意: PHP empty(0) 返回 true。若業務中 0 為有效值(如價格 0 元、狀態碼 0),不可直接用 empty/notempty,應改用比較標籤:
<!-- 價格可能為 0 -->
<eq name="price" value="0"> 免費 <else /> ¥{$price} </eq>
<!-- 或 -->
<if condition="isset($price) && $price !== ''">...</if>

3. 區別 isset 與 empty

場景empty($var)isset($var) (<present>)
未定義truefalse
nulltruefalse
''truetrue
0truetrue
falsetruetrue
[]truetrue

若需「變數已賦值(含 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 判斷價格/數量為 00 視為空,導致「免費」顯示為「空」用 <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 語義)覆蓋所有防禦性判斷場景。將空值處理邏輯封裝在模板中,讓控制器專注於業務數據準備,實現關注點分離。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved