MVC 架構下,視圖層應與業務邏輯分離。早期 PHPLib、FastTemplate 開啟了 PHP 模板先河,後來 Smarty 憑藉「編譯快取」與豐富語法成為事實標準。但隨著專案複雜度提升,Smarty 編譯產出的 PHP 程式碼龐大、物件導向過重,效能成為瓶頸。
| 優點 | 缺點 |
|---|---|
| 語法豐富(修飾詞、區塊、繼承、插件) | 編譯產物極其龐大,大量物件操作拖慢執行速度 |
| 模板快取機制成熟,支援多級快取 | 學習成本高,類似學一門新語言 |
| 生態完善,文檔豐富,團隊協作規範 | 擴展性受限,難以自定義標籤語法 |
Discuz! 採用「標籤直接替換為 PHP 語法」策略,核心僅數十行(include/template.php):
<?php
// 簡化版示意
function template_compile($content) {
$search = [
'/\<\{(\$\w+)\}\>/', // {$var} ->
'/\<\{loop \$(\w+) \$(\w+)\}\>/', // {loop $arr $v} ->
'/\<\{\/loop\}\>/', // {/loop} ->
'/\<\{if\s+(.+?)\}\>/', // {if $cond} ->
'/\<\{\/if\}\>/', // {/if} ->
];
$replace = [
'<?php echo $1; ?>',
'<?php foreach($1 as $2) { ?>',
'<?php } ?>',
'<?php if($1) { ?>',
'<?php } ?>',
];
return preg_replace($search, $replace, $content);
}
?>
| 引擎 | 類型 | 效能 | 學習曲線 | 適用場景 |
|---|---|---|---|---|
| Smarty 3/4 | 編譯+快取 | 中 | 高 | 大型團隊、嚴格前後端分離、需豐富模板功能 |
| Blade (Laravel) | 編譯 | 高 | 低 | Laravel 專案、現代語法糖 |
| Twig (Symfony) | 編譯 | 高 | 中 | Symfony、安全沙箱需求 |
| Plates / Latte | 原生 PHP / 編譯 | 極高 | 極低 | 輕量專案、追求極致效能 |
| Discuz! 風格 | 替換式 | 極高 | 零 | 舊專案維護、極簡需求、團隊全 PHP 技能 |
include 'view.php',變數預先 extract(),零依賴最快。模板引擎沒有銀彈。Smarty 解決了「前後端分離與規範」的時代問題,但現代 PHP 開發更傾向「原生 PHP 即模板」或輕量編譯引擎。理解編譯原理(AST vs 正則替換)、快取策略與安全沙箱,才能根據團隊技能與專案規模做出理性選擇。