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

PHP 模板引擎 Smarty 3 詳細入門指南:配置、語法、緩存與繼承

     編輯:PHP 綜合知識

什麼是 Smarty?

Smarty 是 PHP 模板引擎,實現業務邏輯與表現層分離。程序員專注 PHP 代碼,美工專注 HTML/CSS,團隊協作效率大幅提升。

核心優勢

  • 編譯機制:模板首次訪問編譯為 PHP 文件,再次訪問直接執行編譯文件,性能接近原生 PHP。
  • 緩存技術:可緩存輸出 HTML,跳過 PHP 執行,等同靜態頁速度。
  • 插件系統:自定義修飾符、函數、塊函數,擴展極其靈活。
  • 模板繼承:{block}/{extends} 實現佈局復用,類似 Django/Jinja2。

目錄結構與安裝

Smarty-3.1.12/
├── libs/
│   ├── Smarty.class.php          # 核心類
│   ├── sysplugins/               # 內建插件
│   └── plugins/                  # 自定義插件目錄
├── demo/                         # 示例項目(可重命名為項目名)
│   ├── cache/                    # 緩存文件(需寫入權限)
│   ├── configs/                  # 配置文件
│   ├── templates/                # 模板文件 (.tpl)
│   └── templates_c/              # 編譯文件(需寫入權限)

快速上手

1. 初始化配置

setTemplateDir('demo/templates/');
$smarty->setCompileDir('demo/templates_c/');
$smarty->setCacheDir('demo/cache/');
$smarty->setConfigDir('demo/configs/');

// 開發階段:強制編譯、關閉緩存
$smarty->setForceCompile(true);
$smarty->setCaching(false);

// 上線階段:關閉強制編譯、開啟緩存
// $smarty->setForceCompile(false);
// $smarty->setCaching(true);
// $smarty->setCacheLifetime(3600); // 緩存 1 小時

// 分界符(默認 {},可改避開與 JS/CSS 衝突)
$smarty->left_delimiter  = '{';
$smarty->right_delimiter = '}';

// 調試模式
// $smarty->setDebugging(true);

2. 分配變量

$smarty->assign('name', '張三');
$smarty->assign('users', [
    ['id' => 1, 'name' => '李四'],
    ['id' => 2, 'name' => '王五'],
]);
$smarty->assign('config', ['site_name' => 'MySite', 'version' => '1.0']);

3. 模板文件 (demo/templates/index.tpl)

{* 模板註釋,不會輸出到 HTML *}



    {$config.site_name} - 歡迎


    

你好,{$name}!

{if $users}
    {foreach $users as $user}
  • ID: {$user.id} - 姓名: {$user.name}
  • {/foreach}
{else}

暫無用戶數據

{/if} {* 包含子模板 *} {include file="footer.tpl"}

4. 顯示輸出

$smarty->display('index.tpl');

核心語法速查

語法說明示例
變量輸出直接輸出變量值{$name} {$user.name} {$arr.0}
條件判斷if/elseif/else{if $a gt 10}...{elseif $a eq 5}...{else}...{/if}
循環foreach/section{foreach $arr as $v} {section name=sec loop=$arr}
包含模板復用片段{include file="header.tpl" title="首頁"}
字面量禁用解析,輸出原文(JS/CSS 必備){literal}{/literal}
捕獲輸出將區塊輸出存入變量{capture name=block}...{/capture}{$smarty.capture.block}
配置文件載入 .conf 鍵值對{config_load file="lang.conf" section="zh"} {#key#}
模板繼承佈局復用見下文「模板繼承」
獲取遠程內容fetch URL{fetch file="https://api.example.com/data" assign=data}

模板繼承(Smarty 3 核心特性)

父模板 (layout.tpl)


{block name=title}默認標題{/block}

    
{block name=header}網站 Header{/block}
{block name=content}主內容區{/block}
{block name=footer}版權所有{/block}

子模板 (page.tpl)

{extends file="layout.tpl"}
{block name=title}文章頁 - {$article.title}{/block}
{block name=content}
    

{$article.title}

{$article.content}
{/block} {* 未定義的 block (如 footer) 將繼承父模板內容 *}

規則

  • 子模板必須以 {extends} 開頭。
  • 子模板定義的 {block} 會覆蓋父模板同名區塊。
  • 子模板只能定義 block,其他內容會被忽略。
  • 支援多級繼承:A extends B extends C。

緩存機制深度解析

// 開啟緩存
$smarty->setCaching(true);
$smarty->setCacheLifetime(3600); // 秒

// 模板中局部不緩存(如用戶個人信息)
{nocache}
    歡迎,{$user.name}!餘額:{$user.balance}
{/nocache}

緩存流程

  1. 請求到達 → 檢查緩存文件是否存在且未過期 → 是 → 直接輸出緩存 HTML(跳過 PHP/模板執行)。
  2. 否 → 檢查編譯文件是否存在且模板未修改 → 是 → 執行編譯文件 → 生成緩存 → 輸出。
  3. 否 → 編譯模板 → 生成編譯文件 → 執行 → 生成緩存 → 輸出。

進階配置技巧

  • 多項目共享核心:建立公共配置文件 config/smarty.conf.php,各項目 require 後實例化 $smarty,統一目錄路徑。
  • 插件自動載入:將常用修飾符(如 date_format、truncate)放入 plugins/,命名規則 modifier.名稱.php,函數名 smarty_modifier_名稱。
  • 安全性:模板目錄放在 Web 根目錄外,或 Apache 配置 Deny from all 禁止直接訪問 .tpl。

總結

Smarty 3 提供編譯緩存、模板繼承、插件擴展等現代模板引擎特性,學習曲線平緩,適合中大型 PHP 專案。關鍵配置:開發環境強制編譯+關閉緩存,生產環境關閉強制編譯+開啟緩存+合理設置生命週期。

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