PHP模板引擎的原理與實踐

0x00 模板引擎的原理

模板引擎就是在模板文件中使用一系列提早約定好的標籤代替原生PHP代碼,經過訪問一個PHP的入口文件,會有一個PHP編譯文件根據約定替換模板內標籤以及標籤內變量,最終將模板文件編譯成一個PHP文件,而後展現到瀏覽器中。php

模板文件

前端開發者將前端代碼中的全部數據替換成與服務端開發者約定好的標籤及變量名。html

PHP入口文件

服務端開發者將前端代碼中所須要的變量注入到前端。前端

PHP編譯文件

該文件中是模板引擎中的核心,在這裏咱們定義了 標籤 語句 等,經過讀取模板文件,使用正則表達式去匹配模板文件中與後臺約定好的標籤及變量,並將標籤及變量替換成PHP代碼,最終生成一個先後端結合的PHP文件。正則表達式

0x01 約定標籤

PHP的語法中,包括 if...else foreach 等語法,以及須要替換的普通變量 $value , PHP原生語句,註釋等等。通常狀況下,你們習慣使用如下標籤後端

{$value}
// 對應原生
<?php echo $value; ?>
{foreach $array}
    {V}
{/foreach}
// 對應原生
<?php
foreach($array as $K => $V) {
    echo $V;
}
?>
{if $data == 'XiaoMing'}
    I'm XiaoMing;
{else if $data == 'XiaoHong' }
    I'm XiaoHong;
{else}
    I'm XiaoLi;
{/if}
// 對應原生
<?php
    if($data == 'XiaoMing') {
        echo "XiaoMing";
    } else if ($data == 'XiaoHong') {
        echo "XiaoHong";
    } else {
        echo "XiaoLi";
    }
?>

等等,這些你們能夠參考 Smarty Discuz 的標籤。瀏覽器

0x02 構造正則表達式匹配標籤及變量 

正則表達式30分鐘入門教程緩存

對於正則表達式,你們能夠戳進上面的教程,簡單易用。
下面直接給出相關標籤的正則表達式。函數

// 匹配的正則表達式
$this->T_P[] = "#\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}#";    // 匹配普通變量
$this->T_P[] = "#\{foreach \\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}#";     // 匹配{foreach $array}
$this->T_P[] = "#\{\/(foreach|if)\}#";    // 匹配{/foreach} or {/if}

// 對應的替換內容
$this->T_R[] = "<?php echo \$this->value['\\1']; ?>";
$this->T_R[] = "<?php foreach((array)\$this->value['\\1'] as \$K => \$V) { ?>";
$this->T_R[] = "<?php }?>";

0x03 對模板文件進行編譯

編譯就是對模板文件讀取,使用正則表達式對模板標籤及變量進行替換,最終將替換後的內容保存在一個PHP文件中便可。學習

使用的相關函數:this

<?php
// 讀取文件內容
file_get_contents($file)

// 正則替換
preg_replace(pattern, replacement, subject);
?>

0x04 結束並聲明

經過這三步,一個簡單的模板引擎就已經制做成功了,可是模板引擎的工做原理上面已經說過了,在進行正則匹配替換的過程當中,效率極低,PHP自身效率原本就很低,在加上正則匹配,就可想而知了。因此,通常狀況下,模板引擎都會有本身的緩存機制,將解析成功的內容保存成一個html文件,並設置緩存有效期,這樣能夠很大程度上提高效率。

聲明

本文是學習《PHP核心技術與最佳實踐》列旭鬆 陳文著 第6章 PHP模板引擎的原理與實踐 學習筆記。
感謝做者!

原創文章,轉載時必須以超連接的形式註明做者和原始出處。 | 做者 : 我纔是二亮

相關文章
相關標籤/搜索