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

PHP 設計模式:解釋器模式實作簡易模板引擎

     編輯:PHP 相關知識

模式定義

Interpreter Pattern (解釋器模式):為語言定義文法表示,並定義一個解釋器,用來解釋該語言中的句子。常見於模板引擎、規則引擎、SQL 解析器、正則表達式引擎。

應用場景:模板標籤解析

模板內容包含特定標記(如 <!--{title}-->),解釋器識別並替換為對應資料。

代碼實作

<?php
class TemplateInterpreter {
    private $leftDelimiter  = '<!--{';
    private $rightDelimiter = '}-->';

    public function render(string $template, array $data): string {
        // 將資料變數轉為區域變數,供 eval 上下文使用
        extract($data, EXTR_OVERWRITE);

        // 正則匹配標籤並替換為 PHP 輸出語句
        $pattern = '/'
            . preg_quote($this->leftDelimiter, '/') . '\s*'
            . '(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)'  // 變數名
            . '\s*'
            . preg_quote($this->rightDelimiter, '/')
            . '/';

        // 替換為 
        $compiled = preg_replace_callback($pattern, function($m) {
            return '';
        }, $template);

        // 捕獲輸出
        ob_start();
        eval('?>' . $compiled); // 注意:eval 有安全風險,生產環境請編譯為檔案
        return ob_get_clean();
    }
}

// 使用範例
$tpl = new TemplateInterpreter();
$html = $tpl->render(
    '歡迎 <!--{$username}-->,您的餘額:<!--{$balance}--> 元',
    ['username' => '張三', 'balance' => 123.45]
);
echo $html; // 輸出:歡迎 張三,您的餘額:123.45 元

進階:支援表達式與控制結構

擴充正則規則陣列 $rules,對應不同標籤類型:

$rules = [
    // 變數輸出 
    '//i' => '',
    // 陣列鍵值 
    '//i' => '',
    // 任意 PHP 表達式 
    '//s' => '',
    // PHP 語句 
    '//s' => '',
    // 條件/迴圈需配合編譯器處理,單純正則難以正確巢狀
];

安全與效能警示

  • eval() 風險:模板若來自用戶輸入,極易導致代碼注入。生產環境必須編譯為 PHP 檔案快取,不直接 eval。
  • 正則效能:大型模板多次 preg_replace 會慢,建議單次編譯、多次 include。
  • 功能不足:缺乏繼承、區塊、過濾器、沙箱等現代模板引擎特性。

結論

解釋器模式適合構建領域特定語言 (DSL) 或輕量模板系統。若專案需求超越簡單變數替換,請直接採用 Twig、Blade、Smarty 等成熟方案,它們本質上也是解釋器模式的工業級實現。

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