顧名思義,這是個模板解析的工具。他是爲了解決mvc,實現數據和展現分離問題而產生的。php模板引擎由來已久,好比老大哥smarty。已經不多有人用了。畢竟如今mvc已經很成熟,不少框架都有本身的模板引擎。好比Symfony的twig,Laravel的blade。php
模板引擎開始出現的時候,有不少人質疑,認爲有性能問題。但其實這是沒有必要的。畢竟模板引擎只是編譯一次,把相應的模板語法利用正則替換成php語句,而後存儲成php文件就完成任務了,後續的運行實際上是載入php文件。多出來的僅僅是一個是否存在編譯文件的判斷而已。對於如今的計算速度來講能夠忽略。html
1 從繁瑣的php標籤中脫離出來,從而提升代碼的可讀性
2 將數據處理和視圖展現分離,視圖只負責展現和基本的邏輯判斷
3 很好的進行視圖拆分,組織結構git
除了目的,還有一個不可忽視的問題,是否易學,若是一個模板引擎須要用幾個小時去學習,那這樣的學習成本過高了。做爲一個工具應該簡單易學,其次是能知足需求,功能要完善。
看一下比較主流的模板引擎的使用github
twig,他的使用語法我比較喜歡,很容易看懂,簡單易學緩存
基本語法
{% for user in users %}
* {{ user.name }}
{% else %}
No users have been found.
{% endfor %}
指定佈局文件
{% extends "layout.html" %}
定義展現塊
{% block content %}
Content of the page...
{% endblock %}複製代碼
再看看bladebash
<!-- 文件保存於 resources/views/layouts/app.blade.php -->
<html>
<head>
<title>應用程序名稱 - @yield('title')</title>
</head>
<body>
@section('sidebar')
這是 master 的側邊欄。
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
<!-- Stored in resources/views/child.blade.php -->
@extends('layouts.app')
@section('title', 'Page Title')
@section('sidebar')
@parent
<p>This is appended to the master sidebar.</p>
@endsection
@section('content')
<p>This is my body content.</p>
@endsection複製代碼
上面能夠看出,blade就比twig複雜多了,若是不看說明,你無法理解上面代碼的意思。爲何沒有累出smarty,由於它更復雜,如今使用的人也比較少了。mvc
咱們總結如下,一個模板引擎應該具有如下功能
1 數據塊block/section 這是一個很強大的功能,能夠靈活的控制每個展現塊
2 繼承機制parent 使用parent繼承調用佈局中的內容塊
3 多文件組合include 利用include能夠將多個模板組合到一塊兒,實現多種不一樣場景下的代碼複用
4 靈活的變量函數以及常量使用
5 優雅的標籤邏輯控制 你能夠充分利用ide軟件的代碼提示和自動完成功能,而不須要安裝特殊插件
6 模板自動監聽 當模板更新時,刷新頁面,模板引擎會自動進行編譯,展現最新內容app
在具備上面總結的全部功能的前提下,看看今天的主角是怎麼解決易學,可讀這兩個難題的。框架
<!--佈局文件的代碼-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><block title>默認標題</block></title>
</head>
<body>
<!--展現塊定義-->
<block content>我是佈局模板content</block>
<!--引入模板-->
<include footer></include>
</body>
</html>
<!--內容模板-->
<!--展現塊定義,會覆蓋佈局中的站位-->
<block title>{{ $title }}</block>
<block content>
我是內容模板,可是我用parent標籤,調用了佈局文件中content的內容<br>
<parent content></parent>
</block>複製代碼
是否是清爽至極。定義不一樣的block標籤,靈活的控制內容和位置,內容模板的內容會默認覆蓋佈局文件的相同block塊。還能夠在內容模板,用parent標籤調用佈局文件中的內容。ide
使用html標籤的方式進行代碼書寫,能夠在全部ide軟件中實現代碼不全。上面的代碼實現了展現塊定義,內容模板展現塊覆蓋佈局模板,以及繼承和,外部引入include。
固然,除了對模板的整體管理,模板中還要有流程控制和變量輸出。
//變量
{{ $title }}
// 函數
{{ date('Y-m-d') }}
//普一般量跟變量用法一致,須要用{{}}括起來
{{ CONST_VAR }}
//兩邊下劃線的常量直接使用
//會翻譯爲< ?php if(defined('__APP__')){echo __APP__;}else{echo '__APP__';} ?>
__APP__
// 三目運算
{{ $a==0 ? 0 : 1 }}複製代碼
if判斷
<if ($var>1)>
大於1
<elseif ($var==1)>
等於1
<else/>
小於1
</if>複製代碼
for循環
<for ($i=0;$i<5;$i++)>
{{ $i }}
</for>
普通固然for循環複製代碼
for in
<for $item in $array>
{{ $item['title'] }}
</for>
至關於foreach($array as $item)
<for ($item,$index) in $array>
{{ $index }}=>{{ $item['title'] }}
</for>
至關於foreach($array as $index=>$item)複製代碼
foreach 跟源生php寫法對應只是換成了php標籤形式
<foreach ($array as $item)>
{{ $item['title'] }}
</foreach>
<foreach ($array as $index=>$item)>
{{ $index }}=>{{ $item['title'] }}
</foreach>複製代碼
include "../Template.php";
$view = new Template();
$view->templatePath = './template/';// 模板路徑 最後以/結尾
$view->compilePath = './compile/';// 編譯文件存放路徑 最後以/結尾
$view->layout = 'layout';// 佈局文件在末班目錄下,若是不適用能夠定義成空字符串或false
// 渲染模板
$view->render('index',[
'title'=>'測試頁',
'content'=>'內容',
'array'=>[
1,2,3
]
]);
//清空緩存
//$view->clean();複製代碼
喜歡的朋友歡迎star github.com/shooke/temp…