ThinkPHP <defined> / <notdefined> 標籤用於判斷 PHP 常量是否已定義(對應 defined() 函數)。適用場景:功能開關、版本區分、環境區分(開發/生產)、第三方服務啟用狀態、授權檢查等。將這些判斷放入模板,可實現「配置變更無需修改模板邏輯」。
<defined> 標籤:常量已定義時輸出<defined name="常量名"> 要輸出的內容 </defined>
name:常量名稱(字串,不帶 $,區分大小寫)。{*CONST_NAME*} 輸出(ThinkPHP 模板常量輸出語法)。<?php
// 入口檔、配置檔或控制器動作中
define('SITE_NAME', '我的商城');
define('DEBUG_MODE', true);
define('API_VERSION', 'v2');
// 未定義:ALIPAY_ENABLED
$this->display();
?>
<defined name="SITE_NAME">
<title>{*SITE_NAME*} - 首頁</title>
</defined>
<defined name="DEBUG_MODE">
<div class="debug-bar">調試模式開啟</div>
</defined>
<defined name="API_VERSION">
<script>var API_BASE = '/api/{*API_VERSION*}';</script>
</defined>
<?php if (defined('SITE_NAME')) { echo '' . constant('SITE_NAME') . ' - 首頁 '; } ?>
<notdefined> 標籤:常量未定義時輸出<notdefined name="ALIPAY_ENABLED">
<div class="alert">支付寶支付功能未啟用</div>
</notdefined>
<defined> + <else>(推薦)<defined name="SITE_NAME">
網站名稱:{*SITE_NAME*}
<else />
網站名稱未配置
</defined>
defined() 只檢查「是否存在於常量表」,不檢查值。即使 define('EMPTY_CONST', ''),<defined name="EMPTY_CONST"> 也會命中。
<defined name="THINK_VERSION"> ThinkPHP {*THINK_VERSION*} </defined>
<defined name="APP_DEBUG"> 開發模式 </defined>
name 屬性必須為字面量常量名。若需動態判斷,請在控制器預處理:
<?php
$feature = 'FEATURE_' . strtoupper($module);
$enabled = defined($feature);
$this->assign('feature_enabled', $enabled);
?>
<if condition="$feature_enabled">...</if>
<defined name="API_V2">
<script src="/static/js/api-v2.js"></script>
<link rel="stylesheet" href="/static/css/v2-theme.css">
<else />
<script src="/static/js/api-v1.js"></script>
</defined>
<defined name="ENABLE_WECHAT_SDK">
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>wx.config({...});</script>
<else />
<!-- 微信功能隱藏或降級 -->
</defined>
<defined name="LICENSE_KEY">
<!-- 企業版功能 -->
<a href="/enterprise/report">高級報表</a>
<else />
<span class="text-muted">升級企業版解鎖</span>
</defined>
,極輕量。| 錯誤 | 原因 | 修正 |
|---|---|---|
<defined name="$CONST"> | name 不接受變數,必須為字面量 | 控制器預處理轉為 if 判斷 |
混淆常量與變數:<defined name="site_name"> | PHP 常量慣例全大寫,區分大小寫 | 確認 define('SITE_NAME', ...) 大小寫一致 |
| 期望判斷常量值真假 | defined 只判定義,不判值 | 用 <if condition="CONST_NAME"> 或比較標籤 |
<defined>/<notdefined> 為模板提供「配置驅動渲染」能力,將功能開關、版本差異、環境區分等邏輯從控制器剝離至模板聲明式表達。核心記住:只判定義不判值、常量名全大寫字面量、善用 else 合並雙分支。結合 define() 在入口/配置集中管理,實現「改配置不改代碼」的靈活部署。