Heim Backend-Entwicklung PHP-Tutorial Methoden und Beispiele zum Erstellen von Template-Engines in PHP

Methoden und Beispiele zum Erstellen von Template-Engines in PHP

Jun 04, 2018 am 10:12 AM
php 实例 方法

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

PHP模板引擎就是一个PHP类库,使用它可以使PHP代码和HTML代码进行分离,使代码的可读性和维护性得到显著提高。而且这样做的好处是,让美工专心设计HTML前台页面,程序员专心去写PHP业务逻辑。因此,模化引擎很适合公司的Web开发团队使用,使每个人都能发挥其特长

下面我们就来看看如何简单的来实现php的模板引擎

parser.class.php

<?php
 
/**
 * 模版解析类
 */
class Parser
{
  // 字段,接收模版文件内容
  private $_tpl;
   
  // 构造方法,获取模版文件内容
  public function __construct($_tplFile)
  {
    if (! $this->_tpl = file_get_contents($_tplFile)) {
      exit(&#39;ERROR:模版文件读取错误&#39;);
    }
  }
   
  // 解析普通变量
  private function parvar()
  {
    $_patten = &#39;/<!--\s+\{\$([\w]+)\}\s+-->/&#39;;
    if (preg_match($_patten,$this->_tpl)) {
      $this->_tpl = preg_replace($_patten, "<?php echo \$this->_vars[&#39;$1&#39;];?>",$this->_tpl);
    }
  }
 
  //解析IF语句
  private function parif(){
    $_pattenif = &#39;/<!--\s+\{if\s+\$([\w]+)\}\s+-->/&#39;;
    $_pattenElse = &#39;/<!--\s+\{else\}\s+-->/&#39;;
    $_pattenEndif = &#39;/<!--\s+\{\/if\}\s+-->/&#39;;
    if (preg_match($_pattenif,$this->_tpl)) {
      if (preg_match($_pattenEndif,$this->_tpl)) {
        $this->_tpl = preg_replace($_pattenif,"<?php if (\$this->_vars[&#39;$1&#39;]){?>",$this->_tpl);
        $this->_tpl = preg_replace($_pattenEndif,"<?php } ?>",$this->_tpl);
        if (preg_match($_pattenElse,$this->_tpl)) {
          $this->_tpl = preg_replace($_pattenElse,"<?php }else{?>",$this->_tpl);
        }
      }else{
      echo &#39;ERROR:IF语句没有关闭!&#39;;
      }
    }
  }
 
  //PHP注释解析
 
  private function parCommon(){
    $_pattenCommon = &#39;/<!--\s+\{#\}(.*)\{#\}\s+-->/&#39;;
    if (preg_match($_pattenCommon,$this->_tpl)) {
      $this->_tpl = preg_replace($_pattenCommon,"<?php /* $1 */ ?>",$this->_tpl);
    }
  }
   
  //解析foreach语句
  private function parForeach(){
    $_pattenForeach = &#39;/<!--\s+\{foreach\s+\$([\w]+)\(([\w]+),([\w]+)\)\}\s+-->/&#39;;
    $_pattenForeachEnd = &#39;/<!--\s+\{\/foreach\}\s+-->/&#39;;
    $_pattenForeachValue = &#39;/<!--\s+\{@([\w]+)\}\s+-->/&#39;;
    if (preg_match($_pattenForeach,$this->_tpl)) {
      if (preg_match($_pattenForeachEnd,$this->_tpl)) {
        $this->_tpl = preg_replace($_pattenForeach, "<?php foreach (\$this->_vars[&#39;$1&#39;] as \$$2=>\$$3) {?>", $this->_tpl);
        $this->_tpl = preg_replace($_pattenForeachEnd, "<?php }?>", $this->_tpl);
        if (preg_match($_pattenForeachValue, $this->_tpl)) {
          $this->_tpl = preg_replace($_pattenForeachValue,"<?php echo \$$1;?>",$this->_tpl);
        }
      }else{
      echo &#39;ERROR:Foreach语句没有关闭!&#39;;  
      }
    }
  }
 
  //解析include方法
  private function parInclude(){
    $_pattenInclude = &#39;/<!--\s+\{include\s+file=\"([\w\.\-]+)\"\}\s+-->/&#39;;
    if (preg_match($_pattenInclude,$this->_tpl,$_file,$_file)) {
      if (!file_exists($_file[1])||empty($_file)) {
        echo &#39;ERROR:包含文件出错!&#39;;
      }
      $this->_tpl = preg_replace($_pattenInclude,"<?php include &#39;$1&#39;;?>",$this->_tpl);
    }
  }
 
  //解析系统变量方法
  private function parConfig(){
    $_pattenConfig = &#39;/<!--\s+\{([\w]+)\}\s+-->/&#39;;
    if (preg_match($_pattenConfig,$this->_tpl)) {
      $this->_tpl = preg_replace($_pattenConfig,"<?php echo \$this->_config[&#39;$1&#39;];?>",$this->_tpl);
    }
  }
  // 对外公共方法
  public function compile($_path)
  {
    // 解析模版文件
    $this->parvar();
    $this->parif();
    $this->parForeach();
    $this->parInclude();
    $this->parCommon();
    $this->parConfig();
    // 生成编译文件
    if (! file_put_contents($_path, $this->_tpl)) {
      exit(&#39;ERROR:编译文件生成错误!&#39;);
    }
  }
}
?>
Nach dem Login kopieren

Templates.class.php

<?php
 
/**
 * 模版类
 */
class Templates
{
  //注入变量
  private $_vars = array();
  //保存系统变量数组字段
  private $_config = array();
  //创建一个构造方法,来检测各个目录是否存在
  public function __construct()
  {
    if (! is_dir(TPL_DIR) || ! is_dir(TPL_C_DIR) || ! is_dir(CACHE) || !is_dir(CONFIG)) {
      echo &#39;ERROR:模版目录或编译目录,缓存目录不存在!自动创建!&#39;."<br />";
      if (!is_dir(TPL_DIR)) {
        mkdir(TPL_DIR);
        echo &#39;模版目录&#39;.TPL_DIR.&#39;建立&#39;."<br />";
      }
      if (!is_dir(TPL_C_DIR)) {
        mkdir(TPL_C_DIR);
        echo &#39;编译目录&#39;.TPL_C_DIR.&#39;建立&#39;."<br />";
      }
      if (!is_dir(CACHE)) {
        mkdir(CACHE);
        echo &#39;缓存目录&#39;.CACHE.&#39;建立&#39;."<br />";
      }
      if (!is_dir(CONFIG)) {
        mkdir(CONFIG);
        echo &#39;缓存目录&#39;.CONFIG.&#39;建立&#39;."<br />";
      }
      exit();
    }
    //保存系统变量
    $_sxe = simplexml_load_file(CONFIG.&#39;/config.xml&#39;);
    $_tagLib = $_sxe->xpath(&#39;/root/taglib&#39;);
    foreach ($_tagLib as $_tag) {
      $this->_config["$_tag->name"] = $_tag->value;
    }
  }
 
  //assign()方法,用于注入变量
  public function assign($_var,$_value){
    //$_var用于同步模版里的变量名
    //$_value表示值
    if (isset($_var)&&!empty($_var)) {
      $this->_vars[$_var] = $_value;
    }else{
      exit(&#39;ERROR:设置模版变量!&#39;);
    }
 
  }
 
  //display()方法
  public function display($_file)
  {
    $_tplFile = TPL_DIR . $_file;
    // 判断文件是否存在
    if (! file_exists($_tplFile)) {
      echo &#39;ERROR:模版文件不存在!自动创建Index.tpl模版文件!&#39;;
      file_put_contents($_tplFile,&#39;Index&#39;);
      exit();
    }
 
    //生成编译文件
    $_path = TPL_C_DIR.md5($_file).&#39;-&#39;.$_file.&#39;.php&#39;;
    //缓存文件
    $_cacheFile = CACHE.md5($_file).&#39;-&#39;.$_file.&#39;.html&#39;;
    //当第二次运行相同文件,直接载入缓存文件
    if (IS_CACHE) {
      //判断缓存文件和编译文件都存在
      if (file_exists($_cacheFile)&&file_exists($_path)) {
        //判断模版文件是否修改过
        if (filemtime($_path)>=filemtime($_tplFile)&&filemtime($_cacheFile)>=filemtime($_path)) {
          include $_cacheFile;
          echo &#39;<!--cache-->&#39;;
          return;
        }
      }
    }
    //当编译文件不存在或者文件发生改变则重新生成
    if (!file_exists($_path)||filemtime($_path)<filemtime($_tplFile)) {
      require ROOT_PATH.&#39;/Class/parser.class.php&#39;;
      //构造方法是传入模版文件地址
      $_parser = new Parser($_tplFile);
      //传入编译文件地址
      $_parser->compile($_path);
    }
    //载入编译文件
    include $_path;
    if (IS_CACHE) {
      //获取缓冲区数据
      file_put_contents($_cacheFile,ob_get_contents());
      //清楚缓冲区
      ob_end_clean();
      //载入缓存文件
      include $_cacheFile;
    }
  }
}
?>
Nach dem Login kopieren

templates.php

<?php
//设置字符编码UTF-8
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
 
//网站根目录
define(&#39;ROOT_PATH&#39;,dirname(__FILE__));
 
//存放模版文件夹
define(&#39;TPL_DIR&#39;,ROOT_PATH.&#39;/Templates/&#39;);
 
//编译文件夹
define(&#39;TPL_C_DIR&#39;,ROOT_PATH.&#39;/Templates_c/&#39;);
 
//缓存文件夹
define(&#39;CACHE&#39;,ROOT_PATH.&#39;/Cache/&#39;);
 
//系统变量配置目录
define(&#39;CONFIG&#39;,ROOT_PATH.&#39;/Config/&#39;);
 
//是否开启缓冲区
define(&#39;IS_CACHE&#39;,false);//false
 
//判断是否需要开启
IS_CACHE ? ob_start() : null;
 
//引入模版类
require ROOT_PATH.&#39;/Class/Templates.class.php&#39;;
 
//实例化模版类
$_tpl=new Templates();
 
$_tpl->display(&#39;index.tpl&#39;);
?>
Nach dem Login kopieren

templates/index.tpl

<!DOCTYPE html>
<html lang="zn-cn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <meta name="description" content="">
  <meta name="keywords" content="">
  <meta name="author" content="">
  <meta name="author" content="">
  <title><!-- {WebName} --></title>
  <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
  <link rel="stylesheet" type="text/css" href="css/style.css">
  </head>
<body>
 
<!-- {#}php注释{#} -->
<!-- {if $a} -->
123
<!-- {else} -->
321
<!-- {/if} -->
<br />
<!-- {foreach $array(key,value)} -->
  <!-- {@key} -->...<!-- {@value} --><br />
<!-- {/foreach} -->
系统变量<!-- {WebName} --><br />
普通变量<!-- {$name} --><br />

  <script src="/js/jquery-2.2.1.min.js" type="text/javascript"></script>
  <script src="/js/bootstrap.min.js" type="text/javascript"></script>
  <script type="text/javascript">
  </script>
</body>
</html>
Nach dem Login kopieren

config/config.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <taglib>
    <name>WebName</name>
    <value>XXX网站</value>
  </taglib>
</root>
Nach dem Login kopieren

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP简单实现防止SQL注入的方法

php 数组随机取值的方法及简单实例

安装配置php-fpm来搭建Nginx+PHP的生产环境

Das obige ist der detaillierte Inhalt vonMethoden und Beispiele zum Erstellen von Template-Engines in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

7 PHP-Funktionen, die ich leider vorher nicht kannte 7 PHP-Funktionen, die ich leider vorher nicht kannte Nov 13, 2024 am 09:42 AM

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

See all articles