今天我們來說一下,如何構建自己的 PHP 模版引擎。現在比較流行的 PHP 模版引擎有Twig、Liquid、Mustache、Plates、Blade以及比較古老的Smarty ...
前段時間太忙,導致好久都沒有更新博客了,今天抽出點時間來寫一篇。
其實這個系列的博客很久沒有更新了,之前想好好規劃一下,再繼續寫,然後就放下了,今天再撿起來繼續更新。
今天我們來說一下,如何構建自己的 PHP 模版引擎。現在比較流行的 PHP 模版引擎有Twig、Haml、Liquid、Mustache、Plates、Blade以及比較古老的Smarty
其實關於PHP應不應該使用模版引擎,網上也有不少爭論,在這裡羅列一些使用模版引擎的優點。
- 安全,比如預設轉義輸出
- 可讀性好
相關內容可以參考一下知乎的討論
首先末來確定一下思路,我們先要確定在模版中使用怎樣的寫法,參考 Laravel 的 Blade 模板,定義如下幾種簡單的寫法。
- 輸出變數值
{{ }} 表達式的返回值將被自動傳遞給 PHP 的 htmlentities 函數進行處理,以防止 XSS 攻擊。
Hello, {{ $name }}!
- 輸出未轉義的變數值
Hello, {!! $name !!}!
- If 表達式
通過 @if、@elseif、@else 和 @endif 指令可以創建 if 表達式。
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
- 迴圈
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor
@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach
@while (true)
<p>I'm looping forever.</p>
@endwhile
- 引入其他視圖
@include('view.name', ['some' => 'data'])
暫時先定義這麼多,基本夠用。如果有特殊的需要,可以自己添加,其原理基本是一致的,會寫一個,其他的就都能寫出來。
然後再考慮如何處理,我們定義出了這樣的寫法,PHP 是識別不了的,我們需要將它轉化成 PHP 能夠識別的樣子。
舉個最簡單的例子,當我們拿到{{ $name }}
這樣一段內容時,我們只需要將它轉化成<?php echo $name?>
這樣,就可以識別了,輸出相應的變數值。
是不是很簡單,好像只需要用正則替換一下就可以了,具體實現我在下一篇文章中繼續說~
然後我們還有考慮到性能,每次我們都要做這樣的轉化,是不是很耗性能,我們可以每次都將轉化後的結果緩存起來,當文件發生變化後,再重新轉化,這樣是不是就解決了一部分性能的問題~~
好了,今天就先到這裡。項目內容和博客內容也都會放到Github上,歡迎大家提建議。
code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.9
blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework