PHP从写简单模板引擎,供新手学习
PHP自写简单模板引擎,供新手学习
今天要写点小东西,突然想到要用模板引擎。就“随手”写了一个,发上来供新手学习。搞了这么久PHP,想想也真是感慨,当年研究了几天的东西现在一两个小时就弄完了,当年一起完耍的女神现在已经不知所踪了。。。咳咳,下面是代码:
<?php /**************** * @author: 一曲忧伤 * @email: [email protected] * @discription: 简单模板引擎 */define('INVIEW', true);class view {    var $tpl_dir = 'template';    var $cache_dir = 'cache';    var $tpl_ext = '.html';    var $var_left = '{';    var $var_right = '}';    function __construct($config=array()) {        extract($config);        if(isset($tpl_dir))$this->tpl_dir = $tpl_dir; if(isset($cache_dir))$this->cache_dir = $cache_dir; if(isset($tpl_ext))$this->tpl_ext = $tpl_ext; if(isset($var_left))$this->var_left = $var_left; if(isset($var_right))$this->var_right = $var_right; } function load($tplfilename) { $tplfile = $this->tpl_dir.'/'.$tplfilename.$this->tpl_ext; if(!file_exists($tplfile)) die('Template not found: '.$tplfile); return $this->cache($tplfilename, $tplfile); } //判断模板是否缓存,如模板文件有更改则重新编译 function cache($tplname, $tpl_file) { $cache_file = $this->cache_dir.'/'.md5($tplname).'.php'; if(!file_exists($cache_file) || filemtime($tpl_file)>filemtime($cache_file)) $this->compile($tpl_file, $cache_file); return $cache_file; } //编译模板内容到PHP格式,并写入缓存 function compile($tpl, $cache) { $body = file_get_contents($tpl); $vl = $this->var_left; $vr = $this->var_right; $patterns = array( "#$vl\s*include:(.+?)\s*$vr#i", "#$vl\s*if\s+(.+?)\s*$vr#i", "#$vl\s*else\s*$vr#i", "#$vl\s*elseif\s+(.+?)\s*$vr#i", "#$vl\s*endif\s*$vr#i", "#$vl\s*/if\s*$vr#i", "#$vl\s*foreach\s+(.+?):(.+?)\s*$vr#i", "#$vl\s*endforeach\s*$vr#i", "#$vl\s*/foreach\s*$vr#i", "#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i", "#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i", "#$vl([0-9a-zA-Z_\[\]\'\"]+?)$vr#i", "#$vl([0-9a-zA-Z_]+?):(.*?)$vr#i" ); $replacements = array( "<?php include show('\\1'); ?>", "<?php if(\\1): ?>", "<?php else: ?>", "<?php elseif(\\1): ?>", "<?php endif; ?>", "<?php endif; ?>", "<?php if(count($\\1)>0):\$autoindex=0;foreach($\\1 as \\2):\$autoindex++; ?>", "<?php endforeach;endif; ?>", "<?php endforeach;endif; ?>", "<?php echo $\\1['\\2']['\\3']; ?>", "<?php echo $\\1['\\2']; ?>", "<?php echo $\\1; ?>", "<?php echo \\1(\\2); ?>" ); $body = preg_replace($patterns, $replacements, $body); file_put_contents($cache, "<?php if(!defined('INVIEW'))die('YIQU'); ?>".$body); }}$view = new view();function show($tpl) { global $view; return $view->load($tpl);}
使用方法PHP文件:
<?phpinclude 'view.php';$title = '文档标题';$a=array('a'=>'rows','b'=>array('c'=>'inarray')); include show('index');
使用方法HTML模板文件:
<title>{title}</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8">你好,仅供参考<br>{a.a}{a.b.c}<br>{foreach a:$v}{autoindex}.{v}<br>{/foreach}{include:footer}
模板文件放在template目录,缓存放在cahce目录,这两个目录都要手动创建,缓存加上判断不可直接访问。可以使用
{include:子模板}
{if 条件}
{foreach 变量:as语句},$autoindex为自增变量
{调用函数:参数}
{变量},包含数组变量简化写法(最多只支持三维数组)
等语法。
好了,整个模板引擎实现比较简单,因为一直比较喜欢这种include方式的模板,只供新手学习原理就好了。
=====================国际惯例=======================
刚开始学着写一些博客,写得不好的地方请见谅,觉得还可以就赏脸赞下吧!
我的QQ群(PHP)336533596,QQ 451309839,欢迎加入。相互交流,聊天吹牛~

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 是一个开源MVC 框架。它使开发、部署和维护应用程序变得更加容易。 CakePHP 有许多库可以减少大多数常见任务的过载。

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储
