PHP 關於模板的原理和解析

2021-07-06 03:30:35 字數 4487 閱讀 4019

將php**和靜態html**進行分離,使**的可讀性和維護性得到顯著提高。

使用模板引擎:

我們所說的模板是web模板,是主要由html標記組成的語言來編寫的頁面,但也有如何表示包含動態生成內容的方式(解析標籤)。模板引擎是一種軟體庫,允許我們從模板生成html**,並指定要包含的動態內容。

模板引擎的特點:

1.鼓勵分離:讓更個系統的可讀性和維護性得到提高。

2.促進分工:使得程式設計師和美工去專心處理自己的設計。

3.比php更容易解析:編譯檔案和快取檔案載入更快、佔資源更少。

4.增加安全性:可限制模板設計師進行不安全的操作的能力避免誤刪誤訪問等。

模板處理的流程圖

建立模板:

1、建立初始模板所需要的資料夾和檔案。

a) index.php主檔案,用於編寫業務邏輯。

b) template.inc.php模板初始化檔案,用於初始模版資訊。

c) templates目錄存放所有的模板檔案。

d) templates_c目錄存放所有編譯檔案。

e) cache目錄存放所有快取檔案。

f) includes目錄存放所有的類檔案。

g) config目錄存放模板系統變數配置檔案。

以下是原始碼:

主檔案 index.php  

<?php 

//設定編碼為utf-8

header('content-type:text/html;charset=utf-8');

//**根目錄

define('root_path', dirname(__file__));

//存放模板資料夾

define('tpl_dir', root_path.'/templates/');

//編譯資料夾

define('tpl_c_dir', root_path.'/templates_c/');

//快取資料夾

define('cache_dir', root_path.'/cache/');

//定義快取狀態

define('is_cache',true);

//設定快取狀態開關

is_cache ? ob_start() : null;

include root_path.'/includes/templates.class.php';

$_name = '方塊李';

$array = array(1,2,3,4,5,6);

$_tpl = new templates();

$_tpl->assign('name', $_name);

$_tpl->assign('a', 5>4);

$_tpl->assign('array', $array);

//顯示

$_tpl->display('index.tpl');

?>

模板檔案 html

這是一條php的注釋,在html頁面裡是不顯示的,只會在生成的編譯檔案裡顯示

我將被index.php匯入

這個標籤必須經過parser.class.php這個解析類來解析它1

這裡的內容改變了,為什麼?

顯示一號**

顯示二號**

....

模板類:

class templates 

//獲取系統變數

$_sxe = ******xml_load_file(root_path.'/config/profile.xml');

$_taglib = $_sxe->xpath('/root/taglib');

foreach($_taglib as $_tag)

}//建立變數注入方法

/*** assign()變數注入方法

* @param $_var 要注入的變數名,對應.tpl檔案中的需要替換的變數

* @param $_values 要注入的變數值

*/public function assign($_var,$_values)else

}//建立乙個顯示方法,用來顯示編譯後的檔案

public function display($_file)

//設定編譯檔名

$_parfile = tpl_c_dir.md5($_file).$_file.'.php';

//設定快取檔名

$_cachefile = cache_dir.md5($_file).$_file.'.html';

//判斷快取狀態

if(is_cache)}}

//判斷編譯檔案是否存在,模板檔案是否修改過

if(!file_exists($_parfile) || (filemtime($_parfile) < filemtime($_tplfile)))

//載入編譯檔案

include $_parfile;

if(is_cache) }}

解析類:

class parser 

}//解析普通變數

private function parvar()/';

if (preg_match($_pattern,$this->_tpl))

}//解析if條件語句

private function parif()/';

//結尾if模式

$_patternend = '/\/';

//else模式

$_patternelse = '/\/';

//判斷if是否存在

if(preg_match($_patternif, $this->_tpl)) ?>", $this->_tpl);

//判斷是否有else

if(preg_match($_patternelse, $this->_tpl))else

}else}}

//解析foreach

private function parforeach()/';

$_patternendforeach = '/\/';

//foreach裡的值

$_patternvar = '/\/';

//判斷是否存在

if(preg_match($_patternforeach, $this->_tpl)) ?>", $this->_tpl);

//替換值

$this->_tpl = preg_replace($_patternvar, "<?php echo \$$1?>", $this->_tpl);

}else}}

//解析include

private function parinclude()/';

if(preg_match($_pattern, $this->_tpl,$_file))

//替換內容

$this->_tpl = preg_replace($_pattern, "<?php include '$1';?>", $this->_tpl);}}

//解析系統變數

private function configvar()

}//解析單行php注釋

private function parcommon()(.*)\/';

if(preg_match($_pattern, $this->_tpl))

}//生成編譯檔案

public function compile($_parfile)}}

總結:模板引擎的整個過程:

1、當瀏覽器請求index.php檔案時,例項化模板類對像 $_tpl = new templates();

2、當templates例項化的時候,生成兩個陣列,乙個用來存放模板變數,另乙個存放系統變數,通過構造方法,判斷資料夾是否存在,同時通過xml檔案將系統變數陣列初始化

3、通過模板類templates的注入方法,assign(),將對應模板index.tpl中變數的index.php的內容注入到模板類的私有變數,完成初始化

4、模板類templates類顯示方法display() 通過例項化解析類parser,將取到的注入變數通過解析類進行解析(即替換)

5、解析(替換)後,將檔案寫入php、html混全檔案

6、通過templates類的顯示方法將檔案輸出:

1、第一次執行顯示方法時,將會把php、html混合檔案,生成純靜態的快取檔案

2、呼叫快取檔案,顯示頁面

3、當瀏覽器再次呼叫顯示方法時,首先根據各檔案的最後修改時間,判斷是否重新生成快取檔案或直接呼叫已存在的快取檔案

重點:1、通過正規表示式進行字串的替換

2、熟悉oop

Raft演算法原理和解析

與paxos不同raft強調的是易懂,raft和paxos一樣只要保證n 2 1節點正常就能夠提供服務 raft把演算法流程分為三個子問題 2.follower 從節點 追隨者 日誌同步 剛啟動時候所有節點為follower狀態,響應leader的日誌同步請求,響應candidate請求,把請求到f...

Raft演算法原理和解析

raft演算法原理和解析 原創 小誠信驛站 最後發布於2019 06 20 12 50 58 閱讀數 622 收藏 展開與paxos不同raft強調的是易懂,raft和paxos一樣只要保證n 2 1節點正常就能夠提供服務 raft把演算法流程分為三個子問題 選舉 leader election 日...

php 模板解析,PHP模板解析類例項

class template 模板右標籤 private template c 編譯目錄 private template path 模板完整路徑 private template name 模板名稱 index.html 定義每個模板的標籤的元素 private tag foreach array...