將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...