Smarty 作為經典的 PHP 模板引擎,其變量輸出與字符串拼接語法與原生 PHP 有所不同。本文總結三種在模板中實現字符串拼接的實用技巧,並解析 |cat 修飾符的工作原理。
假設已向模板分配兩個變量:
{assign var="name" value="Richard.Lee"}
{assign var="age" value="27"}
|cat 修飾符(推薦){* 輸出:Richard.Lee---27 *}
{$name|cat:"---"|cat:$age}
{* 輸出:姓名:Richard.Lee,年齡:27 *}
{"姓名:"|cat:$name|cat:",年齡:"|cat:$age}
{* 等效寫法 *}
{"姓名:"|cat:$name|cat:","|cat:"年齡:"|cat:$age}
原理解析: |cat 是 Smarty 內置修飾符,對應 PHP 的 . 運算符。每次調用將左側結果與右側參數拼接,支持鏈式調用。本質上編譯為:
<?php echo $name . '---' . $age; ?>
{* 輸出:Richard.Lee---27 *}
{$name---$age} {* 注意:需確保無歧義 *}
{* 輸出:姓名:Richard.Lee,年齡:27 *}
{"姓名:$name,年齡:$age"}
優勢: 代碼可讀性最強,接近原生 PHP 雙引號字符串語法。
注意: 變量名後若緊跟字母/數字/下劃線,需用 {$name}---{$age} 明確界定邊界。
concat 修飾符(多參數一次性拼接){* 輸出:Richard.Lee---27 *}
{$name|concat:"---":$age}
{* 多參數 *}
{"前綴"|concat:$var1:"中間":$var2:"後綴"}
適用場景: 參數較多時比鏈式 |cat 更清晰,編譯為 implode('', [$name, '---', $age])。
{if $show_age}
{"姓名:$name,年齡:$age"}
{else}
{"姓名:$name"}
{/if}
{$items = ['apple', 'banana', 'orange']}
{foreach $items as $item}
{$item|cat:'、'}
{/foreach}
{* 輸出:apple、banana、orange、 *}
{* 去除尾部分隔符 *}
{foreach $items as $key => $item}
{$item}{if !$key@last}、{/if}
{/foreach}
capture 構建複雜字符串{capture name="user_card"}
<div class="card">
<h3>{$name|escape}</h3>
<p>年齡:{$age}</p>
<p>城市:{$city|default:'未知'}</p>
</div>
{/capture}
{$smarty.capture.user_card}
<?php
$smarty->registerPlugin('modifier', 'join', function($arr, $glue = '') {
return implode($glue, (array)$arr);
});
?>
{* 模板中使用 *}
{$tags|join:', '}
| 方法 | 編譯後 PHP 代碼 | 適用場景 | 推薦指數 |
|---|---|---|---|
| |cat 鏈式 | $a . $b . $c | 簡單拼接、修飾符鏈中 | ⭐⭐⭐⭐⭐ |
| 雙引號插值 | "{$a}{$b}{$c}" | 靜態模板文本為主 | ⭐⭐⭐⭐ |
| |concat | implode('', [$a,$b,$c]) | 動態參數數量不固定 | ⭐⭐⭐ |
| capture | ob_start/ob_get_clean | 大段 HTML 結構構建 | ⭐⭐⭐⭐ |
{$var|cat:'suffix'|escape} 先拼接後義,若需先轉義再拼接請用 {$var|escape|cat:'suffix'}$smarty->error_reporting = E_ALL 開發環境下捕獲未分配變量Smarty 中字符串拼接的核心是 |cat 修飾符與雙引號插值。日常開發中,靜態文本多用雙引號,動態變量鏈用 |cat,複雜結構用 capture。理解編譯原理,能寫出既優雅又高效的模板代碼。