久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP的自定義模板引擎

本文將詳細介紹PHP中的模板引擎。具有很好的參考價值。下面跟著小編一起來看下吧

前面的話

在大多數的項目組中,開發一個Web程序都會出現這樣的流程:計劃文檔提交之后,前端工程師制作了網站的外觀模型,然后把它交給后端工程師,它們使用后端代碼實現程序邏輯,同時使用外觀模型做成基本架構,然后工程被返回到前端工程師繼續完善。就這樣工程可能在后端工程師和前端工程師之間來來回回好幾次。由于后端工程師不干預任何相關HTML標簽,同時也不需要前端代碼和后端代碼混合在一起。前端工程師只需要配置文件,動態區塊和其他的界面部分,不必要去接觸那些錯綜復雜的后端代碼。因此,這時候有一個很好的模板支持就顯得很重要了。本文將詳細介紹PHP中的模板引擎

概述

什么是網站模板?準確地說,是指網站頁面模板,即每個頁面僅是一個板式,包括結構、樣式和頁面布局,是創建網頁內容的樣板,也可以理解為已有的網頁框架??梢詫⒛0逯性械膬热萏鎿Q成從服務器端數據庫中動態內容,目的是可以保持頁面風格一致

PHP是一種HTML內嵌式的在服務器端執行的腳本語言,所以大部分PHP開發出來的Web應用,初始的開發模板就是混合層的數據編程。雖然通過MVC設計模式可以把程序應用邏輯與網頁呈現邏輯強制性分離,但也只是將應用程序的輸入、處理和輸出分開,網頁呈現邏輯(視圖)還會有HTML代碼和PHP程序強耦合在一起。PHP腳本的編寫者必須既是網頁設計者,又是PHP開發者

現在已經有很多解決方案,可以將網站的頁面設計和PHP應用程序幾乎完全分離。這些解決方案稱為“模板引擎”,它們正在逐步消除由于缺乏層次分離而帶來的難題。模板引擎的目的,就是要達到上述提到的邏輯分離的功能。它能讓程序開發者專注于資料的控制或是功能的達成。因此,模板引擎很適合公司的Web開發團隊使用,使每個人都能發揮其專長

模板引擎技術的核心比較簡單。只要將前端頁面指定為模板文件,并將這個模板文件中動態的內容,如數據庫輸出、用戶交互等部分,定義成使用特殊“定界符”包含的“變量”,然后放在模板文件中相應的位置。當用戶瀏覽時,由PHP腳本程序打開該模板文件,并將模板文件中定義的變量進行替換。這樣,模板中的特殊變量被替換為不同的動態內容時,就會輸出需要的頁面

目前,可以在PHP中應用的并且比較成熟的模板有很多,例如Smarty、PHPLIB、IPB等幾十種。使用這些通過PHP編寫的模板引擎,可以讓代碼脈絡更加清晰,結構更加合理化。也可以讓網站的維護和更新變得更容易,創造一個更加良好的開發環境,讓開發和設計工作更容易結合在一起。但是,沒有哪一個PHP模板是最合適、最完美的。因為PHP模板就是大眾化的東西,并不是針對某個人開發的。如果能在對模板的特點、應用有清楚的認識基礎上,充分認識到模板的優勢劣勢,就可以知道是否選擇使用模板引擎或選擇使用哪個模板引擎

自定義模板引擎類

自定義模板引擎,能夠更好的掌握模板引擎的工作機制,為學習Smarty做好準備。更重要的是,屬于自己的PHP模板引擎永遠不是固定不變的,可以根據項目的需要為其量身定制

在下例中,通過前面介紹的模板引擎概念創建了屬于自己的一個簡單模板引擎,可以用來處理模板的基本功能。例如:變量替換、分支結構、數組循環遍歷,以及模板之間相互嵌套等,如下所示:

<?php
 /**
  file: mytpl.class.php 類名為MyTpl是自定義的模板引擎
  通過該類對象加載模板文件并解析,將解析后的結果輸出 
 */
 class Mytpl {
  public $template_dir = 'templates';  //定義模板文件存放的目錄 
  public $compile_dir = 'templates_c';  //定義通過模板引擎組合后文件存放目錄
  public $left_delimiter = '<{';   //在模板中嵌入動態數據變量的左定界符號
  public $right_delimiter = '}>';   //在模板中嵌入動態數據變量的右定界符號
  private $tpl_vars = array();    //內部使用的臨時變量
  /** 
   將PHP中分配的值會保存到成員屬性$tpl_vars中,用于將模板中對應的變量進行替換 
   @param string $tpl_var 需要一個字符串參數作為關聯數組下標,要和模板中的變量名對應 
   @param mixed $value  需要一個標量類型的值,用來分配給模板中變量的值  
  */
  function assign($tpl_var, $value = null) { 
   if ($tpl_var != '')     
    $this->tpl_vars[$tpl_var] = $value;
  }
  /** 
   加載指定目錄下的模板文件,并將替換后的內容生成組合文件存放到另一個指定目錄下
   @param string $fileName 提供模板文件的文件名            
  */
   function display($fileName) { 
   /* 到指定的目錄中尋找模板文件 */
   $tplFile = $this->template_dir.'/'.$fileName; 
   /* 如果需要處理的模板文件不存在,則退出并報告錯誤 */
   if(!file_exists($tplFile)) {     
    die("模板文件{$tplFile}不存在!");
   }
   /* 獲取組合的模板文件,該文件中的內容都是被替換過的 */
   $comFileName = $this->compile_dir."/com_".$fileName.'.php'; 
   /* 判斷替換后的文件是否存在或是存在但有改動,都需要重新創建 */
   if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
    /* 調用內部替換模板方法 */
    $repContent = $this->tpl_replace(file_get_contents($tplFile)); 
    /* 保存由系統組合后的腳本文件 */
    file_put_contents($comFileName, $repContent);
   }
   /* 包含處理后的模板文件輸出給客戶端 */
   include($comFileName);     
  }
  /** 
   內部使用的私有方法,使用正則表達式將模板文件'<{ }>'中的語句替換為對應的值或PHP代碼 
   @param string $content 提供從模板文件中讀入的全部內容字符串 
   @return $repContent   返回替換后的字符串
  */
  private function tpl_replace($content) {
   /* 將左右定界符號中,有影響正則的特殊符號轉義 例如,<{ }>轉義\<\{ \}\> */
   $left = preg_quote($this->left_delimiter, '/');
   $right = preg_quote($this->right_delimiter, '/');
   /* 匹配模板中各種標識符的正則表達式的模式數組 */
   $pattern = array(  
    /* 匹配模板中變量 ,例如,"<{ $var }>" */
    '/'.$left.'\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*'.$right.'/i',  
    /* 匹配模板中if標識符,例如 "<{ if $col == "sex" }> <{ /if }>" */
    '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/ies',
    /* 匹配elseif標識符, 例如 "<{ elseif $col == "sex" }>" */
    '/'.$left.'\s*else\s*if\s*(.+?)\s*'.$right.'/ies', 
    /* 匹配else標識符, 例如 "<{ else }>" */
    '/'.$left.'\s*else\s*'.$right.'/is', 
    /* 用來匹配模板中的loop標識符,用來遍歷數組中的值, 例如 "<{ loop $arrs $value }> <{ /loop}>" */
    '/'.$left.'\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*'.$right.'(.+?)'.$left.'\s*\/loop\s*'.$right.'/is',
    /* 用來遍歷數組中的鍵和值,例如 "<{ loop $arrs $key => $value }> <{ /loop}>" */
    '/'.$left.'\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*=>\s*\$(\S+)\s*'.$right.'(.+?)'.$left.'\s*\/loop \s*'.$right.'/is', 
    /* 匹配include標識符, 例如,'<{ include "header.html" }>' */
    '/'.$left.'\s*include\s+[\"\']?(.+?)[\"\']?\s*'.$right.'/ie'     
   );
   /* 替換從模板中使用正則表達式匹配到的字符串數組 */
   $replacement = array( 
    /* 替換模板中的變量 <?php echo $this->tpl_vars["var"]; */
    '<?php echo $this->tpl_vars["${1}"]; ?>',  
    /* 替換模板中的if字符串 <?php if($col == "sex") { ?> <?php } ?> */
    '$this->stripvtags(\'<?php if(${1}) { ?>\',\'${2}<?php } ?>\')',  
    /* 替換elseif的字符串 <?php } elseif($col == "sex") { ?> */
    '$this->stripvtags(\'<?php } elseif(${1}) { ?>\',"")', 
    /* 替換else的字符串 <?php } else { ?> */
    '<?php } else { ?>', 
    /* 以下兩條用來替換模板中的loop標識符為foreach格式 */
    '<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}<?php } ?>', 
    '<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}<?php } ?>', 
    /*替換include的字符串*/
    'file_get_contents($this->template_dir."/${1}")'    
   );
   /* 使用正則替換函數處理 */
   $repContent = preg_replace($pattern, $replacement, $content);  
   /* 如果還有要替換的標識,遞歸調用自己再次替換 */
   if(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {  
    $repContent = $this->tpl_replace($repContent);    
   } 
   /* 返回替換后的字符串 */
   return $repContent;          
  }
   /**
   內部使用的私有方法,用來將條件語句中使用的變量替換為對應的值
   @param string $expr  提供模板中條件語句的開始標記   
   @param string $statement 提供模板中條件語句的結束標記 
   @return strin    將處理后的條件語句相連后返回 
  */
  private function stripvtags($expr, $statement='') {
   /* 匹配變量的正則 */
   $var_pattern = '/\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*/is'; 
   /* 將變量替換為值 */
   $expr = preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr); 
   /* 將開始標記中的引號轉義替換 */
   $expr = str_replace("\\\"", "\"", $expr);
   /* 替換語句體和結束標記中的引號 */
   $statement = str_replace("\\\"", "\"", $statement); 
   /* 將處理后的條件語句相連后返回 */
   return $expr.$statement;        
  }
 }
?>
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 欧美1区2区| 欧美一级片在线观看 | 成人精品视频在线观看 | 成人福利网 | 亚洲成人精品国产 | 99日韩| 久久免费精品 | 天堂资源 | 蜜桃在线视频 | 精品一二三区视频 | 久久久蜜臀国产一区二区 | 日本精品在线播放 | 国产精品久久视频 | 欧美一级免费看 | 久久久久国产一区二区三区 | 日韩二三区 | 国产在线观看一区二区三区 | 国产精品一区二区av | 婷婷一级片 | 日韩一区二区三区四区五区 | 久久手机在线视频 | 五月婷婷在线视频 | 四虎成人精品永久免费av九九 | 中文字幕 视频一区 | 自拍 亚洲 欧美 老师 丝袜 | 欧美一区二区三区在线看 | 久久综合婷婷 | 成人福利视频 | 亚洲精品v日韩精品 | 欧美成视频 | 69热视频在线观看 | 一区二区三区高清 | 日韩不卡一二区 | eeuss国产一区二区三区四区 | 婷婷色在线播放 | 欧美精品一区二区三区在线播放 | av电影一区| 亚洲欧美中文日韩在线v日本 | 91精品中文字幕一区二区三区 | 亚洲网在线 | 亚洲经典一区 |