【PHP 模板引擎】Prototype 原型版發佈!

在文章的開頭,首先要向一直關注個人人說聲抱歉!由於本來是打算在前端框架5.0發佈以後,就立馬完成 PHP 模板引擎的第一版。但我沒能作到,並且一直拖到了15年元旦才完成,有很嚴重的拖延症我很慚愧,再次抱歉!php

以前有說過之後的做品發佈文章都會同步發表相應的 API 使用說明,但我以爲這還不夠好並且博客平臺對錶格的處理和顯示不是很友好,致使 API 不能完美的呈現,所以打算只提供 API 連接,你們能夠經過連接直接訪問到個人官網去查閱手冊,那樣的閱讀體驗是最好的。而發佈的文章之後則更新一些和 API 相關的使用教導,提供一些小例子,讓你們在閱讀 API 的同時,也可以經過實際例子去更加深入的體會到代碼的各類用法與業務邏輯思想!html

 

如下是 API 手冊與實例演示連接前端


【實例演示】http://www.shibuyi.net/demo/php/template_engine/prototype程序員

【官方 API 使用手冊】http://www.shibuyi.net/api/php/template_engine/prototype編程

【筆者我的官網】http://www.shibuyi.netapi

 

 

下面爲 PHP 模板引擎 Prototype 原型版使用教導,如下直接簡稱:模板引擎!數組

什麼?不知道模板引擎是啥?可能會有 PHP 新手會問這樣的問題,那我就簡單的回答一下吧。模板引擎其實就是 PHP 的一箇中間件技術,讓傳統的 Web 動態網站編程變得更加輕鬆,爲何這麼說呢?之前不輕鬆嗎?那是由於在模板引擎出現以前,幾乎全部的 Web 服務端程序員都是經過混編代碼完成工做的,所謂混編就是一張頁面中既包含:PHP 也包含 HTML 甚至還有其餘語言的代碼,所以項目若是逐漸擴展,開發和維護的時間成本是極高的,還容易出錯,美工與程序也很差配合,若是美工一點也不理解程序,那基本上沒辦法看混編文件。而模板引擎的誕生就很好的解決了這一難題。它採用模板技術將混編文件中的 PHP 業務邏輯層代碼與 HTML 表現層代碼進行了很好的切割分離,程序員則能夠安心的設計程序,而美工則安心的設計界面,兩者之間會使用一種模板標記的特殊符號進行關聯,方便模板引擎讀取模板文件以後能夠順利的進行編譯操做。市面上 PHP 已經有不少至關成熟的模板引擎了,如:Smarty 模板引擎等等,其餘 Web 服務端語言也有本身相應的模板引擎,或者與模板引擎相似的中間件技術。緩存

關於模板引擎的詳細介紹,推薦你們訪問百度百科:http://baike.baidu.com/view/4258079.htm前端框架

在學習模板引擎以前你們要先保證本身已經瞭解了 PHP 的 OOP(面向對象編程)思想,由於模板技術是採用 OOP 思想描述的,若是不懂 OOP 那麼這篇文章就不適合您閱讀,由於門檻太高!框架

 

首先你們看到的圖片是模板引擎的目錄結構圖(筆者使用的是 ZendStudio 7.2.1 集成開發環境):

1. caches 爲模板緩存目錄(若不存在模板引擎第一次執行會自動生成);

2. classes 爲模板引擎核心類庫;

3. compiles 爲模板編譯目錄(若不存在模板引擎第一次執行會自動生成);

4. constants 爲模板常量目錄(若不存在模板引擎第一次執行會自動生成);

5. includes 爲模板配置目錄;

6. templates 爲模板文件目錄(若不存在模板引擎第一次執行會自動生成)。

 

在瞭解了模板引擎的目錄後,接下來咱們就來看看如何讓他運做起來。在原型版中模板引擎的相關初始化和配置信息都是在 includes/template.inc.php 文件中完成的(你們能夠打開實例演示的源碼進行查閱)。

其實對模板引擎的配置又叫作初始化過程,初始化的第一步就是配置相應的目錄,讓模板引擎可以正確的讀取和寫入該目錄中的數據(配置步驟你們能夠自由選擇,不必定非要按照個人順序來配置,但必定要在實例化模板引擎以前完成,不然將會失效),而咱們則假設與模板引擎在同一目錄下進行配置,而且建立 index.php 文件用來存儲配置信息,若是非同一目錄對於根目錄的配置則須要注意調整。

 

1. 首先第一步是配置模板引擎的根目錄,若是不設置則會自動生成根目錄的絕對路徑。

Template :: $rootPath = dirname(__FILE__); // 相對與絕對路徑都可,咱們這裏則採用絕對路徑!如:"C:/wwwroot/prototype"

 

2. 配置模板文件目錄,這個目錄是用來存放模板文件的,若是不設置則默認爲:templates 目錄。

// 這裏則採用默認目錄,你們根據本身的需求進行設置,建議不要寫中文容易出錯,目錄名的先後加不加正反斜槓都無所謂,最終模板引擎內部會自動校訂!
Template :: $templateName = '/templates/';

 

3. 配置編譯文件目錄,這是用來存儲模板文件被解析後生成的編譯文件,若是不設置則默認爲:compiles 目錄。

Template :: $compileName = '/compiles/'; // 和模板目錄同樣也採用默認目錄。

 

4. 配置緩存文件目錄,這是在模板引擎開啓緩存功能後,用來存儲編譯文件生成的緩存文件,若是不設置默認爲:caches 目錄。

Template :: $cacheName = '/caches/'; // 同樣使用默認

 

5. 配置模板常量目錄,可能你們不太理解模板常量是用來幹嗎的,和普通的 PHP 常量又有什麼區別?關於模板常量的解釋,在接下來的運用中咱們在詳細探討,這裏就先跟我進行配置便可,若是不設置則默認爲:constants 目錄。

Template :: $constantName = '/constants/'; // 使用默認

 

6. 到第六步爲止,目錄的配置就所有完成了,你們不用擔憂目錄不存在的問題,也無需手動去建立,模板引擎內部會自動幫咱們完成。那麼接下來就是設置模板常量的文件名稱,若是不設置則默認爲:default.xml 文件,和目錄同樣不存在模板引擎會自動建立。

// 咱們也採用默認,但你們要注意的是這裏必須採用 .xml 爲擴展名,由於常量文件是以 XML 標記描述的,若是不是 .xml 結尾,那麼可能會致使模板引擎在處理常量時出現異常狀況!
Template :: $constantFile = 'default.xml';

 

7. 設置緩存開關,緩存默認狀況下是被關閉的,只有咱們去設置他,纔會開啓。

// 你們注意,這裏我寫的是一個布爾值,其實這裏能夠填寫任意值,最終都會被隱式轉換爲布爾值,寫 0 或 1 均可以,我直接寫布爾值是爲了方便你們的理解!
Template :: $cacheSwitch = true;

 

8. 至此模板引擎的配置基本上就已經所有完成了,仍是很簡單的。如今咱們只須要實例化出模板引擎對象,就能夠真正的運行模板引擎了。

$tpl = new Template(); // 實例化出模板引擎,從這一步開始以前的全部配置所有生效,模板引擎實例化時不須要傳遞任何參數。

 

9. 在實例化出模板引擎對象之後,咱們就能夠開始對其進行操做,那麼對誰進行操做呢?固然是模板文件了,首先咱們要先建立模板文件。在模板文件目錄中進行建立。模板文件實際上是純 HTML 代碼文件,擴展名能夠自定義,而咱們約定俗成,都 .tpl 爲擴展名。假設咱們已經建立了一個模板文件名爲:index.tpl,由於和咱們的 php 業務邏輯文件 index.php 同名,這也是按照慣例約定俗成,由於 index.php 文件調用 index.tpl 模板,見名知意。

 

10. 在建立了模板文件以後,咱們就能夠在業務文件(以前的配置也都是在 index.php 中執行的)中進行對模板文件的加載以及注入模板變量,關於模板變量和其餘的模板標識符(又統稱模板標記)將在接下來的步驟中逐一講解。

// 注入變量的格式有兩種,你們注意看 API 手冊的說明,數組格式與傳統的鍵值對格式都可以,咱們兩種都使用一下。
$tpl -> assign('title', '頭銜'); // 首先是傳統鍵值對格式
$tpl -> assign(array('title' => '頭銜', 'name' => '名稱')); // 數組格式明顯要更加好用一些,由於在注入多個變量時,就能夠不用寫多個注入語句,一句話就搞定了。

// 若是出現了兩個如出一轍的變量名稱,那麼其後會將以前的給替換掉。如下代碼,最終 language 變量的值爲:英文。
$tpl -> assign(array('language' => '中文', 'language' => '英文'));// 接下來是加載模板文件,直接寫模板名稱便可,模板引擎會自動鎖定到模板文件目錄。
$tpl -> display('index.tpl');

 

11. 至此對模板引擎的操做就結束了,接下來咱們將熟悉一下模板文件中的各個模板標記的使用方法,他們都是用來作什麼的。在原型版中模板標記一共有 9 種,分別爲:1. 模板變量、2. 模板常量、3. 單行模板註釋、4. 多行模板註釋、5. include 文件加載、6. template 模板文件加載、7. source 源模板文件加載(較爲特殊)、8. if 分歧語句、9. foreach 循環語句。那麼咱們首先解釋一下模板變量吧。

<div id="main">
    <!-- 剛剛咱們注入了 title 變量,那麼在模板文件中就能夠對其進行調用了,調用方法就是保持同名,按照這樣的格式抒寫便可{$模板變量名稱}-->
    <!-- 模板變量的命名規範與 PHP 普通變量如出一轍,首位不能爲數字,且區分大小寫,注意保證格式的正確性,若是錯誤模板引擎將不會對其進行解析 -->
    <a href="###">{$title}</a> <!-- 正確的格式,被正確解析 -->
    <a href="###">{$123}</a> <!-- 錯誤的格式,沒法解析 -->
</div>

 

12. 下面是模板常量的使用,模板常量和 PHP 常量雖然名字上都叫他常量,其實本質上並不是一回事。模板常量其實能夠看作是僞常量,而並不是真正的常量,他是經過對 XML 標記的存儲,來實現一種全局不變的特定值,這些值須要手動的添加到常量文件中。(手動添加其實不太方便,筆者會在其後的版本迭代中,加入自動添加的功能)

首先咱們須要在模板常量文件中手動添加模板常量,代碼以下:

<?xml version="1.0" coding="utf-8" ?>
<root>
    <!-- 必須在 root 根標記中間進行添加,並且一個標記字母都不能出錯,注意區分大小寫,若是不慎寫錯,模板引擎將沒法對其進行獲取 -->
    <constant>
        <key>WEBNAME</key> <!-- 這裏填寫常量名稱注意字母必須所有大寫,第一位不能爲數字,格式與 PHP 定義常量同樣 -->
        <value>網站標題</value> <!-- 常量值 -->
    </constant>
    
    <constant>
        <key>123abc</key> <!-- 錯誤的常量名 -->
        <value></value> <!-- 值能夠爲空 -->
    </constant>
</root>

 配置好常量後,接下來就是在模板文件中進行調用,代碼以下:

<!-- 模板常量的調用和變量相似,只是取消了 $ 符號,另外和配置的常量名要保持一致 -->
<title>{WEBANME}</title> <!-- 正確的名稱,將被正確解析 -->
<p>{NAME}</p> <!-- 雖然格式正確,但剛纔沒有進行 NAME 常量的配置,所以最終解析後會返回一個空值 -->
<p>{abc123}</p> <!-- 錯誤的名稱,沒法解析 -->

 

13. 下面是模板的註釋符,有兩種:一種爲單行,一種爲多行。經常使用於對模板文件代碼的註解,可讓美工配合設計界面的時候瞭解代碼的實際含義。

<!-- 你們能夠把模板註釋放到 HTML 註釋符號中,這樣美工在設計模板頁面的時候會更加一目瞭然。-->
<!-- 單行註釋的格式是:{@}內容可寫可不寫,但不寫也就沒有意義了 -->
{@ 普通的單行註釋} <!-- 正確的格式 -->
<!-- {@ HTML 註釋符號中的單行註釋} --> <!-- 正確的格式 -->
{@ 換行的
單行註釋} <!-- 格式錯誤,單行註釋沒法換行,模板引擎沒法解析 -->
<!-- 多行註釋的格式是:{#}...{/#}一頭一尾要呼應,內容也能夠不寫 -->
{#}這是多行註釋,注意首位呼應!{/#} <!-- 正確的格式 -->
{#}這是多行註釋,
我換行了!{/#} <!-- 正確的格式 -->
{#}沒有寫結尾符號 <!-- 錯誤的格式,模板引擎沒法解析 -->

 

14. 模板加載標識符,加載方式分爲 3 類,別分爲:include 對普通文件的直接加載;template 對模板文件進行編譯後加載;source 對模板文件進行編譯後直接輸出編譯文件的路徑(此方法較爲特殊且並不完美,須要在特定的場合中使用,好比:框架頁面的調用)

首先是對普通文件的加載調用,代碼以下:

<!-- 注意抒寫格式,被直接加載的文件多半是 php 文件,且文件必需要存在,不存在的文件,模板引擎將會給出一個錯誤提示,而且終止代碼的執行 -->
<!-- 文件名先後的引號,單雙引號均可以,但必須保持一致,不能一單一雙,不然模板引擎將不會對其解析 -->
{include path = "test.php"} <!-- 正確的格式,將被解析 -->
{include path = 'abc.php"} <!-- 錯誤的格式,沒法被解析 -->
<!-- 若是出現了同一個文件被加載了兩次,那麼模板引擎只會對其加載第一次後,自動忽略其後的加載 -->
{include path = "123.php"} <!-- 第一次被加載成功 -->
{include path = "123.php"} <!-- 與上一個文件同屬一個文件,將沒法被再次加載,而被自動忽略 -->

下面是對模板文件的編譯加載,代碼以下:

<!-- 格式與 include 方式基本同樣,就不重複闡述了,不同的是 include 是須要給出具體的路徑地址,而 template 則只須要給出模板名稱便可,模板引擎會自動找到該模板文件 -->
{template path = 'test.tpl'} <!-- 正確的格式,將會被編譯後加載 -->

最後就是模板文件的編譯地址的輸出,該功能較特殊,即便不理解也不要緊,該方法有嚴重的 BUG 還沒有處理完畢,所以並不完美,且使用的機率也極低,這裏只作簡單的介紹。在其後的版本迭代中,是否會保留並完善,尚在定奪,代碼以下:

<!-- 這裏咱們將使用 iframe 框架頁面,來調用 source 加載方法,調用格式與前兩種雷同,就不在闡述 -->
<!-- 這樣使用其實就能夠了,但有嚴重的 BUG 出現,緣由是全部在 frame.tpl 中注入的模板標記被解析後,將沒法找到源頭,也就是說 php 將沒法對其正確處理,而且由於沒法找到源頭,而會報錯,該 BUG 的解決方案還在研究中,這裏僅提供給你們思考 -->
<iframe src="{source path = 'frame.tpl'}"></iframe>

 

15. 接下來是常常會被用到的 if 分歧語句,他和 php 的 if 語句很相似,但功能上卻很簡單,且不支持多重判斷以及嵌套判斷,但我會在其後的版本迭代中讓其功能逐步強大。

<!-- if 語句的格式其實和多行註釋同樣,必定要注意首位呼應,但大小寫無所謂都可以支持和 PHP 原生的 if 語句是同樣的。 -->
{if $action} <!-- 只要被注入的 {$action} 變量的值爲 true,或隱式轉換後爲 true,那麼 if 語句中的代碼將被顯示 -->
<p>界面1</p>
{/if}

{if !$action} <!-- 加入了邏輯非的判斷,只要爲 false 則被顯示 -->
<p>界面2</p>
{/if}

{if $action} <!-- 雙層判斷的時候,爲 true 時顯示界面1,爲 false 時顯示界面2 -->
<p>界面1</p>
{else}
<p>界面2</p>
{/if}

{if $action} <!-- 錯誤的格式,沒有結尾,不會被模板引擎解析 -->

 

16. 終於到了最後的也是最複雜的 foreach 循環語句的調用了,其功能和 PHP 同樣,只是格式上稍有改動。

<!-- 注意在調用 foreach 和 if 語句同樣要首尾呼應,並且若是變量不是數組格式,那麼 php 將會自動報出一個錯誤 -->
<!-- 其中 $array 就是被注入的模板變量,注意要是數組格式;而 key 和 value 則是對應數組中的鍵值對,必須寫,不然格式不正確,將沒法被模板引擎解析 -->
{foreach $array(key, value)}
    <p>{%key} ... {%value}</p> <!-- 注意鍵值對能夠不是 key 和 value,但必定要和以前同名,不然沒法被解析 -->
{/foreach}

{foreach $userList(id, username)}
   <p>{%id} ... {%username}</p> <!-- 自定義的鍵值對,格式正確 -->
   <p>{%password}</p> <!-- 錯誤的格式,並無被定義,所以沒法被解析 -->
{/foreach}

 

好了,寫到這裏我也能夠長長的舒口氣,模板引擎原型版的教導到此就結束了。雖然教導文章已經很詳細了,但建議你們配合 API 手冊和實例代碼進行參照閱讀,這樣效果會更好更便於理解和掌握。固然由於是文章,因此即便你描述的再詳細,文字也是抽象的,須要你們多動手,而對於動手能力較差的新手們,這篇教導文章則起不到多大的做用,可能反而會被弄得一頭霧水,甚至最終對此厭惡,因此我有想過若是之後有可能,在版本迭代更新到必定程度後,我會針對性的出一套系列教導視頻,那樣的話就不會像文字這樣抽象,新手也可以很快的學習。

 

若是你是從頭看到尾,那麼我真心感謝您的閱覽,我想你應該有什麼話想說,請必定要在下面留言告訴我,有問題也請及時留言,感謝各位的支持~!

相關文章
相關標籤/搜索