phplib 是早期 PHP 經典模板引擎,雖已歷史性退場,但其「編譯時解析 + 區塊嵌套 + 變量替換」設計思想仍具參考價值。本文系統梳理核心 API、區塊嵌套邏輯、循環渲染模式與靜態頁生成技巧。
| 方法 | 作用 | 關鍵參數 |
|---|---|---|
set_file(handle, filepath) | 載入模板文件,返回句柄 | 支持數組批量載入 |
set_block(parent_handle, block_name, alias) | 聲明可重複區塊 | block_name 為模板中註釋標識 |
set_var(var_name, value, [append]) | 變量賦值/追加 | append=true 觸發追加模式 |
parse(target_handle, source_handle, [append]) | 解析模板,替換變量/區塊 | append=true 追加到目標句柄 |
pparse(handle, source_handle) | parse + 輸出 (echo) | 等價 parse 後 p() |
p(handle) | 直接輸出已解析內容 | — |
get(handle) | 獲取解析後字符串 | 用於靜態頁生成/緩存 |
{var_name}
<!-- BEGIN block_name -->
... 可重複內容 ...
<!-- END block_name -->
<table>
<!-- BEGIN rowlist -->
<tr>
<!-- BEGIN collist -->
<td>{cell_value}</td>
<!-- END collist -->
</tr>
<!-- END rowlist -->
</table>
$t = new Template(); // 假設類名
$t->set_file('main', 'main.htm');
$t->set_var('title', '首頁');
$t->parse('output', 'main');
$t->p('output');
$t->set_file('main', 'main.htm');
$t->set_block('main', 'rowlist', 'RL');
$t->set_block('rowlist', 'collist', 'CL');
for ($i = 0; $i < 5; $i++) {
$t->set_var('CL', ''); // 關鍵:清理內層區塊,防止內容疊加
for ($j = 0; $j < 5; $j++) {
$t->set_var('cell_value', "Row$i-Col$j");
$t->parse('CL', 'collist', true); // true = 追加
}
$t->parse('RL', 'rowlist', true); // 追加行
}
$t->pparse('output', 'main'); // 解析主模板並輸出
核心心法: 內層區塊每輪外層循環必須 set_var('alias', '') 清空,否則會產生指數級疊加。
$t->set_var([
'site_name' => '博客園',
'slogan' => '專注技術分享',
'year' => date('Y')
]);
$t->set_file(['layout' => 'layout.htm', 'content' => 'content.htm']);
$t->set_var('content_title', '文章標題');
$t->parse('CONTENT', 'content');
$t->set_var('main_content', $t->get('CONTENT')); // 獲取內容填入佈局
$t->pparse('output', 'layout');
$t->set_file('page', 'article.htm');
// ... 賦值、解析 ...
$html = $t->get('page'); // 獲取最終 HTML 字符串
file_put_contents('/var/www/html/article_123.html', $html);
利用 get() 將動態渲染結果落盤,配合緩存失效策略,實現高性能靜態化。
| 坑點 | 現象 | 修正 |
|---|---|---|
| 未清理內層區塊 | 列表內容指數級重複 | 外層循環首行 set_var('inner_alias', '') |
| 區塊別名衝突 | 解析錯誤/內容錯位 | 別名採用唯一前綴:RL_行、CL_列 |
| 模板路徑相對/絕對混用 | 文件找不到 | 統一用絕對路徑或設定 set_root() |
| 大括號衝突 (JS/JSON 內嵌) | 誤觸發變量替換 | 模板引擎通常支持轉義或修改定界符 |
phplib 以 區塊嵌套 + 追加解析 + 變量替換 三大機制,用純 PHP 實現了編譯型模板的核心功能。理解其「句柄→區塊→別名→追加/清理」流程,有助於理解現代引擎的底層邏輯;維護舊項目時,掌握上述模式可快速定位渲染異常。