奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

php語言

PHP的自定義引擎使用方法

時間:2024-11-03 17:17:32 php語言 我要投稿
  • 相關推薦

PHP的自定義模板引擎使用方法

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

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

  概述

  什么是網(wǎng)站模板?準確地說,是指網(wǎng)站頁面模板,即每個頁面僅是一個板式,包括結構、樣式和頁面布局,是創(chuàng)建網(wǎng)頁內(nèi)容的樣板,也可以理解為已有的網(wǎng)頁框架。可以將模板中原有的內(nèi)容替換成從服務器端數(shù)據(jù)庫中動態(tài)內(nèi)容,目的是可以保持頁面風格一致

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

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

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

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

  自定義模板引擎類

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

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

  <?php

  /**

  file: mytpl.class.php 類名為MyTpl是自定義的模板引擎

  通過該類對象加載模板文件并解析,將解析后的結果輸出

  */

  class Mytpl {

  public $template_dir = 'templates';  //定義模板文件存放的目錄

  public $compile_dir = 'templates_c';  //定義通過模板引擎組合后文件存放目錄

  public $left_delimiter = '<{';   //在模板中嵌入動態(tài)數(shù)據(jù)變量的左定界符號

  public $right_delimiter = '}>';   //在模板中嵌入動態(tài)數(shù)據(jù)變量的右定界符號

  private $tpl_vars = array();    //內(nèi)部使用的臨時變量

  /**

  將PHP中分配的值會保存到成員屬性$tpl_vars中,用于將模板中對應的變量進行替換

  @param string $tpl_var 需要一個字符串參數(shù)作為關聯(lián)數(shù)組下標,要和模板中的變量名對應

  @param mixed $value  需要一個標量類型的值,用來分配給模板中變量的值

  */

  function assign($tpl_var, $value = null) {

  if ($tpl_var != '')

  $this->tpl_vars[$tpl_var] = $value;

  }

  /**

  加載指定目錄下的模板文件,并將替換后的內(nèi)容生成組合文件存放到另一個指定目錄下

  @param string $fileName 提供模板文件的文件名

  */

  function display($fileName) {

  /* 到指定的目錄中尋找模板文件 */

  $tplFile = $this->template_dir.'/'.$fileName;

  /* 如果需要處理的模板文件不存在,則退出并報告錯誤 */

  if(!file_exists($tplFile)) {

  die("模板文件{$tplFile}不存在!");

  }

  /* 獲取組合的模板文件,該文件中的內(nèi)容都是被替換過的 */

  $comFileName = $this->compile_dir."/com_".$fileName.'.php';

  /* 判斷替換后的文件是否存在或是存在但有改動,都需要重新創(chuàng)建 */

  if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {

  /* 調(diào)用內(nèi)部替換模板方法 */

  $repContent = $this->tpl_replace(file_get_contents($tplFile));

  /* 保存由系統(tǒng)組合后的腳本文件 */

  file_put_contents($comFileName, $repContent);

  }

  /* 包含處理后的模板文件輸出給客戶端 */

  include($comFileName);

  }

  /**

  內(nèi)部使用的私有方法,使用正則表達式將模板文件'<{ }>'中的語句替換為對應的值或PHP代碼

  @param string $content 提供從模板文件中讀入的全部內(nèi)容字符串

  @return $repContent   返回替換后的字符串

  */

  private function tpl_replace($content) {

  /* 將左右定界符號中,有影響正則的特殊符號轉義 例如,<{ }>轉義\<\{ \}\> */

  $left = preg_quote($this->left_delimiter, '/');

  $right = preg_quote($this->right_delimiter, '/');

  /* 匹配模板中各種標識符的正則表達式的模式數(shù)組 */

  $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標識符,用來遍歷數(shù)組中的值, 例如 "<{ 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',

  /* 用來遍歷數(shù)組中的鍵和值,例如 "<{ 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'

  );

  /* 替換從模板中使用正則表達式匹配到的字符串數(shù)組 */

  $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}")'

  );

  /* 使用正則替換函數(shù)處理 */

  $repContent = preg_replace($pattern, $replacement, $content);

  /* 如果還有要替換的標識,遞歸調(diào)用自己再次替換 */

  if(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {

  $repContent = $this->tpl_replace($repContent);

  }

  /* 返回替換后的字符串 */

  return $repContent;

  }

  /**

  內(nèi)部使用的私有方法,用來將條件語句中使用的變量替換為對應的值

  @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;

  }

  }

  ?>

  在Mytpl類中聲明的多個方法中,除被封裝過的方法之外,只有兩個公有方法assign()和display()在創(chuàng)建對象以后可以被凋用。其中assign()方法用來將PHP腳本中的數(shù)據(jù)分配給模板中對應的變量,display()方法則用來將特定的templates目錄下的模板文件加載到PHP腳本中。同時將模板文件中使用“<{”和“>>”標記聲明的自定義模板語句,匹配出來并替換成相對應的PHP語法格式,然后將替換后的內(nèi)容保存在特定的templates_c目錄下。在運行時還要編譯成一個非模板技術的PHP文件,并將其以模板文件名加上“com_”前綴和“.php”的擴展名形式保存。再通過include()函數(shù)將處理后的模板文件包含,并使用PHP解析后發(fā)送給客戶端

  使用模板引擎

  使用自定義的模板引擎比較容易,都是自己定義的語法格式。但要記住,所有流行的模板引繁解決方案都遵循同樣的一組相同的核心實現(xiàn)原則,就是與編程語言一樣,學習了一種語言就可以更容易地掌握其他語言。使用模板引擎最主要的原因就是將前端工程師和后端工程師的工作分開,所以模板引擎不僅后端工程師需要使用,前端工程師也需要使用

  1、后端工程師對模板引擎的使用

  在PHP腳本中包含模板引擎類所在的文件。如下所示:

  require("mytpl.class.php");    //包含模板引擎類,相當于模板引擎安裝

  創(chuàng)建模板引擎類的對象并對一些成員屬性進行初始化賦值。如下所示:

  $tpl=new MyTpl(); //創(chuàng)建模板引擎類的對象,也可以根據(jù)參數(shù)對成員初始化

  將動態(tài)數(shù)據(jù)(包括標量和數(shù)組類型的數(shù)據(jù),例如從數(shù)據(jù)庫的表中獲得的數(shù)據(jù)數(shù)組)使用模板引擎對象中的assign()方法分配給模板文件,這個方法可以使用多次,將任意多個變量分配給模板。如下所示:

  ?

  1

  2

  $tpl->assign("var","this is a value"); //可以分配標量類型數(shù)據(jù),可以使用多次

  $tpl->assign("arr",array(array(1,2),array("a","b"))); //也可以分配數(shù)組包括多維數(shù)組

  在PHP腳本中通過調(diào)用模板對象中的display()方法,并將模板文件名作為參數(shù)傳入,就會加載指定目錄中對應的模板文件到PHP腳本中。再通過模板引擎中的替換方法對模板中自定義的語法進行解析,然后輸出處理后的模板。如下所示:

  $tpl->display("test.tpl");    //參數(shù)“test.tpl”為特定目錄下的模板文件

  2、前端工程師對模板引擎的使用

  前端工程師需要將編寫的模板文件存放到指定的目錄中,這個目錄是通過在模板對象中使用$template_dir屬性指定的,默認的設置是當前目錄下的“templates”目錄。另外,模板文件的命名以及后綴名的設置可以隨意,例如index.tpl、test.htm、header.tp;等

  模板文件是通過使用HTML、CSS以及javascript等Web前臺語言以編寫的純靜態(tài)負而。但可以在模板文件中使用“<{”和“}>”兩個分隔符中間定義一個變量(類似PHP中的變量格式),該變量可以接受并輸出由PHP腳本中分配過來的動態(tài)數(shù)據(jù)。在模板中使用的“<{”和“}>”兩個分隔符對,也可以根據(jù)個人愛好在模板引擎類中修改。如下所示:

  姓名:<{$name}>,年齡:<{$age}>,性別:<{$sex}> //模板中使用占位符

  如果在PHP腳本中是將數(shù)組分配給模板,也可以在模板中進行遍歷,還可以通過嵌套的方式遍歷多維數(shù)組。使用的是在模板引擎中定義的“<{loop}>”標記對,使用的方式和PHP中foreach結構的語法格式相似。如下所示:

  <{loop $arr $value }>     //遍歷數(shù)組$arr中的元素值

  數(shù)組中的元素值<{$value}>   //每次遍歷輸出元素中的值

  <{/loop}>        //在模板中遍歷數(shù)組的結束標記

  <{loop $arr $key=>$value }>   //遍歷數(shù)組$arr中的元素下標和元素值

  數(shù)組中的元素鍵<{$key}>    //每次遍歷輸出元素中的下標

  數(shù)組中的元素值<{$value}>   //每次遍歷輸出元素中的值

  <{/loop}>        //在模板中遍歷數(shù)組的結束標記

  <{loop $arr $value }>     //遍歷數(shù)組$arr中的元素值

  <{loop $arr $data }>    //使用嵌套標記遍歷二維數(shù)組

  數(shù)組中的元素值<{$value}>  //每次遍歷輸出元素中的值

  <{/loop}>       //在模板中遍歷數(shù)組的內(nèi)層結束標記

  <{/loop}>        //在模板中遍歷數(shù)組的外層結束標記

  模板引擎還可以解析在模板文件中使用特殊標記編寫的分支結構,語法風格也是和PHP的分支結構類似。是通過在模板文件中使用“<{if}>”標記對實現(xiàn)選擇結構,也可以實現(xiàn)多路分支和嵌套分支的選擇結構。如下所示:?

  <{if($var=="red")}>

  <p style="color:red">這是“紅色”的字</p>

  <{elseif($var=="green")}>

  <p style="color:green">這是“綠色”的字</p>

  <{else}>

  <{if($size=20)}>

  <p style="font-size:20">這是“20px”大小的字</p>

  <{/if}>

  <{/if}>

  在自定義的模板引擎中,也添加了在模板文件中包含其他模板文件的功能。可以使用“<{include‘子模板文件名'}>”標記將子模板包含到當前模板中,還支持在子模板中再次包括另外的子模板。如下所示:

  <{include 'other.tpl' }>

  使用示例分析

  通過在程序中加載模板引擎可以將前端語言與后端語言的代碼分開。首先在PHP程序中獲取數(shù)據(jù)庫中存儲的數(shù)據(jù),再通過加載模板引擎將數(shù)據(jù)分配出去,然后將模板文件再通過模板引擎加載并處理后輸出。所以PHP程序只是創(chuàng)建動態(tài)數(shù)據(jù),加載模板引擎并將動態(tài)數(shù)據(jù)分配給模板,完成了PHP程序的工作。而模板的設汁也只需要前端工程師獨立完成,使用HTML、CSS及javascript等前臺頁面設計語言編寫。另外,在模板文件中還需要使用模板引擎可以解析的標記,將PHP中分配過來的動態(tài)數(shù)據(jù)在模板中引用

  1、數(shù)據(jù)庫的設計

  假設數(shù)據(jù)庫服務器在“localhost”主機上,連接的用戶名和密碼分別為“admin”和“123456”,在該服務器上創(chuàng)建一個名為“mydb”的數(shù)據(jù)庫,并在該數(shù)據(jù)庫中創(chuàng)建一個名為“User”的用戶表。創(chuàng)建該表的SQL査詢語句如下所示:

  CREATE TABLE User(

  id SMALLINT(3) NOT NULL AUTO_INCREMENT,

  name VARCHAR(10) NOT NULL DEFAULT '',

  sex VARCHAR(4) NOT NULL DEFAULT '',

  age SMALLINT(2) NOT NULL DEFAULT '0',

  email VARCHAR(20) NOT NULL DEFAULT '',

  PRIMARY KEY (id)

  );

  用戶表User創(chuàng)建完成以后,接著可以向該表中插入一些數(shù)據(jù)作為示例演示使用,SQL查詢語句如下所示:

  INSERT INTO User (name,sex,age,email) VALUES

  ("a","男",27,"a@a.com"),

  ("b","女",22,"b@b.com"),

  ("c","女",30,"c@c.com"),

【PHP的自定義引擎使用方法】相關文章:

PHP構建自定義搜索引擎的方法10-24

PHP分頁自定義函數(shù)09-08

利用PHP自定義多進制06-16

PHP autoload函數(shù)的使用方法10-22

PHP中trait的使用方法08-20

php自定義函數(shù)實現(xiàn)漢字分割替換06-01

PHP如何自定義一個函數(shù)09-19

PHP引擎全速運轉的三個絕招07-22

php-smarty模版引擎中的緩存應用04-23

php中iconv函數(shù)使用方法08-23

主站蜘蛛池模板: 祁门县| 屯门区| 砀山县| 台州市| 南陵县| 昭苏县| 开阳县| 厦门市| 周宁县| 上高县| 红桥区| 乌拉特前旗| 惠州市| 萨嘎县| 内黄县| 池州市| 金塔县| 平度市| 井陉县| 华蓥市| 阳曲县| 新田县| 虞城县| 房山区| 桂林市| 浙江省| 建宁县| 怀集县| 社旗县| 孟津县| 讷河市| 大理市| 平南县| 眉山市| 株洲县| 灵丘县| 张北县| 确山县| 元阳县| 图木舒克市| 长宁县|