php制作简单模版引擎,php模版引擎
php制作简单模版引擎,php模版引擎
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('ERROR:模版文件读取错误'); } } // 解析普通变量 private function parvar() { $_patten = '/<!--\s+\{\$([\w]+)\}\s+-->/'; if (preg_match($_patten,$this->_tpl)) { $this->_tpl = preg_replace($_patten, "<?php echo \$this->_vars['$1'];?>",$this->_tpl); } } //解析IF语句 private function parif(){ $_pattenif = '/<!--\s+\{if\s+\$([\w]+)\}\s+-->/'; $_pattenElse = '/<!--\s+\{else\}\s+-->/'; $_pattenEndif = '/<!--\s+\{\/if\}\s+-->/'; if (preg_match($_pattenif,$this->_tpl)) { if (preg_match($_pattenEndif,$this->_tpl)) { $this->_tpl = preg_replace($_pattenif,"<?php if (\$this->_vars['$1']){?>",$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 'ERROR:IF语句没有关闭!'; } } } //PHP注释解析 private function parCommon(){ $_pattenCommon = '/<!--\s+\{#\}(.*)\{#\}\s+-->/'; if (preg_match($_pattenCommon,$this->_tpl)) { $this->_tpl = preg_replace($_pattenCommon,"<?php /* $1 */ ?>",$this->_tpl); } } //解析foreach语句 private function parForeach(){ $_pattenForeach = '/<!--\s+\{foreach\s+\$([\w]+)\(([\w]+),([\w]+)\)\}\s+-->/'; $_pattenForeachEnd = '/<!--\s+\{\/foreach\}\s+-->/'; $_pattenForeachValue = '/<!--\s+\{@([\w]+)\}\s+-->/'; if (preg_match($_pattenForeach,$this->_tpl)) { if (preg_match($_pattenForeachEnd,$this->_tpl)) { $this->_tpl = preg_replace($_pattenForeach, "<?php foreach (\$this->_vars['$1'] 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 'ERROR:Foreach语句没有关闭!'; } } } //解析include方法 private function parInclude(){ $_pattenInclude = '/<!--\s+\{include\s+file=\"([\w\.\-]+)\"\}\s+-->/'; if (preg_match($_pattenInclude,$this->_tpl,$_file,$_file)) { if (!file_exists($_file[1])||empty($_file)) { echo 'ERROR:包含文件出错!'; } $this->_tpl = preg_replace($_pattenInclude,"<?php include '$1';?>",$this->_tpl); } } //解析系统变量方法 private function parConfig(){ $_pattenConfig = '/<!--\s+\{([\w]+)\}\s+-->/'; if (preg_match($_pattenConfig,$this->_tpl)) { $this->_tpl = preg_replace($_pattenConfig,"<?php echo \$this->_config['$1'];?>",$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('ERROR:编译文件生成错误!'); } } } ?>
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 'ERROR:模版目录或编译目录,缓存目录不存在!自动创建!'."<br />"; if (!is_dir(TPL_DIR)) { mkdir(TPL_DIR); echo '模版目录'.TPL_DIR.'建立'."<br />"; } if (!is_dir(TPL_C_DIR)) { mkdir(TPL_C_DIR); echo '编译目录'.TPL_C_DIR.'建立'."<br />"; } if (!is_dir(CACHE)) { mkdir(CACHE); echo '缓存目录'.CACHE.'建立'."<br />"; } if (!is_dir(CONFIG)) { mkdir(CONFIG); echo '缓存目录'.CONFIG.'建立'."<br />"; } exit(); } //保存系统变量 $_sxe = simplexml_load_file(CONFIG.'/config.xml'); $_tagLib = $_sxe->xpath('/root/taglib'); 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('ERROR:设置模版变量!'); } } //display()方法 public function display($_file) { $_tplFile = TPL_DIR . $_file; // 判断文件是否存在 if (! file_exists($_tplFile)) { echo 'ERROR:模版文件不存在!自动创建Index.tpl模版文件!'; file_put_contents($_tplFile,'Index'); exit(); } //生成编译文件 $_path = TPL_C_DIR.md5($_file).'-'.$_file.'.php'; //缓存文件 $_cacheFile = CACHE.md5($_file).'-'.$_file.'.html'; //当第二次运行相同文件,直接载入缓存文件 if (IS_CACHE) { //判断缓存文件和编译文件都存在 if (file_exists($_cacheFile)&&file_exists($_path)) { //判断模版文件是否修改过 if (filemtime($_path)>=filemtime($_tplFile)&&filemtime($_cacheFile)>=filemtime($_path)) { include $_cacheFile; echo '<!--cache-->'; return; } } } //当编译文件不存在或者文件发生改变则重新生成 if (!file_exists($_path)||filemtime($_path)<filemtime($_tplFile)) { require ROOT_PATH.'/Class/parser.class.php'; //构造方法是传入模版文件地址 $_parser = new Parser($_tplFile); //传入编译文件地址 $_parser->compile($_path); } //载入编译文件 include $_path; if (IS_CACHE) { //获取缓冲区数据 file_put_contents($_cacheFile,ob_get_contents()); //清楚缓冲区 ob_end_clean(); //载入缓存文件 include $_cacheFile; } } } ?>
templates.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',ROOT_PATH.'/Cache/'); //系统变量配置目录 define('CONFIG',ROOT_PATH.'/Config/'); //是否开启缓冲区 define('IS_CACHE',false);//false //判断是否需要开启 IS_CACHE ? ob_start() : null; //引入模版类 require ROOT_PATH.'/Class/Templates.class.php'; //实例化模版类 $_tpl=new Templates(); $_tpl->display('index.tpl'); ?>
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>
config/config.xml
<?xml version="1.0" encoding="UTF-8"?> <root> <taglib> <name>WebName</name> <value>XXX网站</value> </taglib> </root>
您可能感兴趣的文章:
- php smarty模版引擎中的缓存应用
- php smarty模版引擎中的缓存应用
- php smarty模版引擎中变量操作符及使用方法
- ThinkPHP模版引擎之变量输出详解

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Travailler avec la base de données dans CakePHP est très simple. Nous comprendrons les opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) dans ce chapitre.

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.
