第一二九天上课 PHP 自制简单开发模板
构建基础架构
在项目文件夹(自定义)下创建
(1)核心目录:WQ
(2)模板目录:MoBan
(3)编译目录:BianYi
(4)创建配置文件: config.ini.php
<?php //获取文件所在目录 $Gen=dirname(__FILE__); //设置模板目录 define('MoBan',$Gen.'/MoBan/'); //设置核心类目录 define('WQ',$Gen.'/WQ/'); //设置编译文件目录 define('BianYi',$Gen.'/BianYi/'); //加载核心类 include WQ.'WQ.class.php'; //调用核心类 $wq=new WQ();
(5)在核心目录WQ下创建系统核心类WQ.class.php
<?php //系统核心类 class WQ { //变量成员(一个可以放下无数变量的数组) private $BianLiang = array(); //构造方法 public function __construct() { if(!is_dir(MoBan) || !is_dir(BianYi)) { exit("模板目录:MoBan 或 编译目录:BianYi 不存在!请手动创建"); } } //注册变量的方法 public function assign($key,$value) { if(empty($key)) { exit("错误:注册变量名不能为空"); } $this->BianLiang["$key"]=$value; } //调用模板的方法 public function display($MoBanMing) { //获取模板路径 $MoBanLuJing=MoBan.$MoBanMing; //容错,当模板不存在时 if(!file_exists($MoBanLuJing)) { exit('错误:模板文件不存在'); } //编译文件路径 $BianYiLuJing=BianYi.md5($MoBanMing).$MoBanMing.'.php'; //生成编译文件 if(!file_exists($BianYiLuJing) || filemtime($BianYiLuJing)<filemtime($MoBanLuJing)) { //引入解析类文件,实例化解析类并调用解析方法 include WQ.'JieXi.class.php'; $JieXi= new JieXi($MoBanLuJing); $JieXi->jiexi($BianYiLuJing); } //载入编译文件 include $BianYiLuJing; } }
(5)在核心目录WQ下创建模板解析类JieXi.class.php
<?php //模板解析类 class JieXi { private $MoBanNeiRong; //构造方法 public function __construct($MoBanLuJing) { if(!$this->MoBanNeiRong=file_get_contents($MoBanLuJing)) { exit('错误:模板文件读取错误'); } } //对外公共方法 public function jiexi($BianYiLuJing) { //调用普通变量解析法 $this->jiexi_bianliang(); //调用foreach标签解析法 $this->jiexi_foreach(); //生成编译文件 if(!file_put_contents($BianYiLuJing,$this->MoBanNeiRong)) { exit('错误:编译文件生成失败'); } } //解析普通变量 private function jiexi_bianliang() { //赋值变量解析正则 $ZhengZe='/<\{\$([\w]+)\}>/'; if(preg_match($ZhengZe,$this->MoBanNeiRong)) { $TiHuan="<?php echo \$this->BianLiang['$1'] ?>"; //替换解析模板变量 $this->MoBanNeiRong=preg_replace($ZhengZe,$TiHuan,$this->MoBanNeiRong); } } //解析foreach标签 private function jiexi_foreach() { //赋值解析正则 $ZhengZe="/<\{foreach\s+([\w]+)\(([\w]+),([\w]+)\)\}>/"; $ZhengZe_end="/<\{\/foreach\}>/"; $ZhengZe_nei="/<\{([\w]+)\}>/"; if(preg_match($ZhengZe,$this->MoBanNeiRong)) { if(preg_match($ZhengZe_end,$this->MoBanNeiRong)) { //替换模板标签foreach $this->MoBanNeiRong=preg_replace($ZhengZe_end,'<?php } ?>',$this->MoBanNeiRong); $TiHuan="<?php foreach(\$this->BianLiang['$1'] as \$$2 => \$$3){ ?>"; $this->MoBanNeiRong=preg_replace($ZhengZe,$TiHuan,$this->MoBanNeiRong); if(preg_match($ZhengZe_nei,$this->MoBanNeiRong)) { //替换foreach标签索引及变量 $TiHuan="<?php echo \$$1 ?>"; $this->MoBanNeiRong=preg_replace($ZhengZe_nei,$TiHuan,$this->MoBanNeiRong); } } else { exit("错误:foreach标签没有封闭"); } } } }
跨域访问 : 接口的书写声明
//接口头函数,允许所有ip访问 header('Access-Control-Allow-Origin:*'); //定义访问形式header("Access-Control-Allow-Methods:HEAD,POST,GET,PUT,DELETE,OPTIONS"); //响应头设置(如果设置,启动页面也需要设置) //header('Access-Control-Allow-Headers:x-requested-with,content-type');
第一二九天上课 PHP 自制简单开发模板的更多相关文章
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
- 小白自制Linux开发板 二. u-boot移植
上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB 中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...
- Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld
Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述———— 隐鹤 / HelloWorld 1. 引言 自本人第一篇博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要 ...
- 《Linux内核设计与实现》 第一二章学习笔记
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...
- day 82 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- day 81 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- 小白自制Linux开发板 三. Linux内核与文件系统移植
上一篇完成了uboot的移植,但是想要愉快的在开发板上玩耍还需要移植Linux内核和文件系统. 1.Linux内核 事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi ...
- 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置
目录 沁恒CH32V003(一): CH32V003F4P6开发板上手报告和Win10环境配置 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置 硬件准备 沁 ...
- Spring Boot 2.X(二):集成 MyBatis 数据层开发
MyBatis 简介 概述 MyBatis 是一款优秀的持久层框架,支持定制化 SQL.存储过程以及高级映射.它采用面向对象编程的方式对数据库进行 CRUD 的操作,使程序中对关系数据库的操作更方便简 ...
随机推荐
- C#调试心经(1)(转)
我们在做程序开发时,难免会遇到错误异常.如何快速地找到出错的地方.分析错误的原因以及找到解决问题的方案,是许多初级程序员困扰的问题,这也正是经验的宝贵之处.下面我将简单介绍在Visual Studio ...
- pstools使用教程
pstools是sysinternals开发的一个功能强大的nt/2k远程管理工具包. 官方网址为http://www.sysinternals.com/ 下载地址为http://www.sysint ...
- PHP http 简单用户验证
<?php $valid_passwords = array ("user" => "password"); $valid_users = arra ...
- nginx下rewrite参数超过9个的解决方法
nginx 在处理多于9个参数的时候,是采用重命名的方法来实现的: /?m?([0-9,]*)h?(\d*)a?([0-9,]*)c?(\d*)s?(x?f?(?P<f>[0-9,]*)/ ...
- ruby 中%Q %q %W %w %x %r %s的用法
%Q 用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") >> %Q(Joe said: "Fr ...
- Discrete.Differential.Geometry-An.Applied.Introduction(sig2013) 笔记
The author has a course on web: http://brickisland.net/DDGSpring2016/ It has more reading assignment ...
- Python 2.7.x 和 3.x 版本的重要区别
许多Python初学者都会问:我应该学习哪个版本的Python.对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本.等学得差不多了,再 ...
- iOS开发 - OC - 实现本地数据存储的几种方式一
iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...
- 基于JS功能强大的日期插件Kalendae
开发中需要一个日期插件,可以在zepto下使用,可以选择日期段,可以设置不可选日期 找到一个完全满足的,并且基于JS不依赖于任何库. 在线演示:http://chipersoft.com/Kalend ...
- appium移动端测试之滑动(二)
在ios测试中,需要用到滑动,所以用java封装了一套滑动的方法,不多说,贴代码 /** * 上滑1/4屏幕 */ public void slideUP1_4() { int x = driver. ...