构建基础架构

在项目文件夹(自定义)下创建

(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 自制简单开发模板的更多相关文章

  1. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  2. 小白自制Linux开发板 二. u-boot移植

    上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB  中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...

  3. Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld

    Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述———— 隐鹤  /  HelloWorld 1. 引言 自本人第一篇博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要 ...

  4. 《Linux内核设计与实现》 第一二章学习笔记

    <Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...

  5. day 82 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  6. day 81 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  7. 小白自制Linux开发板 三. Linux内核与文件系统移植

    上一篇完成了uboot的移植,但是想要愉快的在开发板上玩耍还需要移植Linux内核和文件系统. 1.Linux内核 事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi ...

  8. 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置

    目录 沁恒CH32V003(一): CH32V003F4P6开发板上手报告和Win10环境配置 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置 硬件准备 沁 ...

  9. Spring Boot 2.X(二):集成 MyBatis 数据层开发

    MyBatis 简介 概述 MyBatis 是一款优秀的持久层框架,支持定制化 SQL.存储过程以及高级映射.它采用面向对象编程的方式对数据库进行 CRUD 的操作,使程序中对关系数据库的操作更方便简 ...

随机推荐

  1. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  2. jQuery源码:从原理到实战

    jQuery源码:从原理到实战 jQuery选择器对象 $(".my-class"); document.querySelectorAll*".my-class" ...

  3. R语言-数据结构

    1.向量 向量是用来存储数值型.字符型或逻辑性数据的一维数组,用函数c()创建向量 a <- c(1,2,5,6,4) b <- c("one","two&q ...

  4. git学习1:git安装和配置

    Git是什么?世界上最先进的分布式版本控制系统,记录了一个文本文件的每次一修改信息,比如,一篇散文,从草稿到最终出版,经历过无数次修改,修改了标点符号形成一个版本,老师帮助修改形成一个版本,同学帮忙修 ...

  5. ld.so.conf 和 ldconfig

    1. 查看执行文件的链接库 ldd 例子: # ldd /sbin/sln not a dynamic executable “not a dynamic executable”是 ldd 说明 sl ...

  6. Android WebView的Js对象注入漏洞解决方案

    http://blog.csdn.net/leehong2005/article/details/11808557/ webview调用以下文件,就可以打印sdcard 文件名 <!DOCTYP ...

  7. Disruptor 极速体验

    已经不记得最早接触到 Disruptor 是什么时候了,只记得发现它的时候它是以具有闪电般的速度被介绍的.于是在脑子里, Disruptor 和"闪电"一词关联了起来,然而却一直没 ...

  8. ActiveX控件打包、签名、嵌入详解

    ActiveX控件打包.签名.嵌入详解 前言 在我们的一个项目中,使用到了大华网络监控摄像头枪机,网络上下载了其ActiveX插件,但是发现其所提供的类库没有打包处理.这就导致我们每次给用户安装的时候 ...

  9. Mongo集合操作Aggregate

    最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得.. 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一 ...

  10. [ActionScript 3.0] AS3.0和AS2.0的相互通信

    AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) ...