使用模板引擎的好處是數據和視圖分離。一個簡單的PHP模板引擎原理是php
extract數組($data),使key對應的變量能夠在此做用域起效html
打開輸出控制緩衝(ob_start)數組
include模板文件,include遇到html的內容會輸出,可是由於打開了緩衝,內容輸出到了緩衝中測試
ob_get_contents()讀取緩衝中內容,而後關閉緩衝ob_end_clean()this
封裝一個Template類spa
<?php class Template { private $templatePath; private $data; public function setTemplatePath($path) { $this->templatePath = $path; } /** * 設置模板變量 * @param $key string | array * @param $value */ public function assign($key, $value) { if(is_array($key)) { $this->data = array_merge($this->data, $key); } elseif(is_string($key)) { $this->data[$key] = $value; } } /** * 渲染模板 * @param $template * @return string */ public function display($template) { extract($this->data); ob_start(); include ($this->templatePath . $template); $res = ob_get_contents(); ob_end_clean(); return $res; } }
test.php.net
<?php include_once './template.php'; $template = new Template(); $template->setTemplatePath(__DIR__ . '/template/'); $template->assign('name', 'salamander'); $res = $template->display('index.html'); echo $res;
template目錄下index.html文件code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板測試</title> <style> * { padding: 0; margin: 0; box-sizing: border-box; } h1 { text-align: center; padding-top: 20px; } </style> </head> <body> <h1><?=$name?></h1> </body> </html>
爲何display要返回一個字符串呢?緣由是爲了更好的控制,嵌入到控制器類中。
對於循環語句怎麼辦呢?這個的話,請看流程控制的替代語法htm