第一二九天上课 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 的操作,使程序中对关系数据库的操作更方便简 ...
随机推荐
- centos 7 安装zabbix3.0
1.安装MySQL 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自带的repos安装很简单: # yum install -y mariadb mariadb- ...
- Squid代理服务器
缓存代理概述:做为应用层的代理服务软件,squid主要提供缓存加速,应用层过滤控制的功能. 1.代理的工作机制 当客户机通过代理来请求web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有 ...
- crontab服务详解(任务计划)
crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 servi ...
- PHP MYSQL单向同步方案
项目上有个需求,需要从外网服务器的MYSQL同步到本地服务器上. 思路如下: 1 在外网MYSQL中创建表 table_change_log ,记录表中数据的更改记录. DROP TABLE IF E ...
- Creating Classes 创建类
The dojo/_base/declare module is the foundation of class creation within the Dojo Toolkit. declare a ...
- MSSQL和Oracle常用函数比对
数学函数 序号 函数功能 SQL Server用法 Oracle用法 1 绝对值 select abs(-1) value select abs(-1) value from dual 2 取整(大) ...
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- 无索引状态下比较DataTable的几种过滤方法效率
先构造一个DataTable: public DataTable GetDataTable() { DataTable dtTmp = new DataTable(); dtTmp.Columns.A ...
- sharedPreferences的用法
做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连 接跟操作等耗时大大影响了程序的效率,因此我们使用键值这 ...
- XE6 & IOS开发之开发者账号、苹果证书(3):关于在XE6中使用苹果证书的简单介绍
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.关于在XE6中使用苹 ...