第一二九上课 PHP 自制简单开发模板(1)

构建基础架构

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

(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标签没有封闭");
            }
        }
    }
}
时间: 2024-10-01 22:18:24

第一二九上课 PHP 自制简单开发模板(1)的相关文章

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

swift编程语言简单开发二维码扫描

最近在学习swift编程语言(http://www.maiziedu.com/course/ios/16-161/), 在看视频学习swift编程语言时,发现有个二维码扫面案例的教程,非常的不错,其中还有一些动画的实现 ,今天就先记录一下二维码扫描的简单实现  不太好记手写一遍 学习的基础在于模仿嘛 创建一个实现二维码扫描的步骤 1.首先是懒加载创建 会话 输入设备  输出设备 // 先倒入框架 AVFoundation 2.    import AVFoundation 3.    //通过懒

家电二维码售后服务平台系统开发

家电二维码售后服务平台系统开发,家电二维码售后系统开发,小吴183.2071.6434微电,家电二维码售后软件开发,家电二维码售后平台开发. 互联网平台的节点有两大类型:第一基数节点,也就是弱连接的节点,其规模要大,越大越好,互联网的价值与节点数的平比成正比.第二活跃节点,也就是强连接的节点,其能量要强,越强越好,互联网的价值与其强度成正比. 一.家电维修行业"维修黑幕"层出不穷 记者从一位从事家电维修人士那里了解到,目前行业公认当前家电维修行业有陷阱,"维修黑幕"

二、Java语言的简单认识及Hello World示例

1. Java语言的简单认识 (1) Java有三个版本: a. JAVA SE (以前称J2SE):Standard Environment 标准版本: b. JAVA EE (以前称J2EE):Enterprise Environment 企业版: c. JAVA ME (以前称J2ME):Eicro Environment 微型版; (2) Java的安装目录 在前一讲中,提到安装目录中有两个文件夹,分别是jdk1.7.0_45和jre7.在"jdk1.7.0_45"文件夹的bi

一号旺铺:国内第一个专注于微信小程序开发的后端云产品

启航 一号旺铺是天玑旗下继一号旺铺(wangpu1.com,媒体和小程序商店)后又一个基于微信生态的核心产品. 6 月 13 日,「一号旺铺」上线公测了. 「一号旺铺」www.wangpu1.com,是国内第一个专注于微信小程序开发的 BaaS(Backend as a Service)产品,它可以让开发者更快.更轻松地做出优美.稳定的小程序,且不失灵活性.爱范儿技术团队为此努力了 100 天,夜以继日,没有鸡腿. 爱范儿 CTO 在朋友圈写道:一号旺铺本是为了解决内部需求而设计的 BaaS 平

java提高篇(二九)-----Vector

在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现类Vector,Vector 类可以实现可增长的对象数组. 一.Vector简介 Vector可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删除操作. Vector实现List接口,继承

第一章 Android系统移植与驱动开发概述 心得体会

第一章 Android系统移植与驱动开发概述 心得体会 通过学习Android深度探索(卷1)HAL与驱动开发的第一章Android系统移植与驱动开发,我对android驱动开发与移植概念有了一个整体且系统的把握.在本章中我主要学到了一下的知识 1.Android的系统架构分为Linux内核.C/C++代码库.Android SDK API.应用程序四层. 其中重点讲解第一层 Linux 内核.这一层主要包括Linux的驱动程序以及内存管理.进程管理.电源管理等程序. 2. Android移植可

Struts2的&quot;两个蝴蝶飞,你好&quot;简单开发(一)

我把你的头像,设置成我的名字,此刻你便与我同在. 我把你的名字,写进我的代码里面,以后,我的世界便存在着你. “两个蝴蝶飞”特别喜欢"java1234知识分享网"小峰的实用主义,所以本文及其系列文章均是采用实用主义,从项目和代码的角度去分析.由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍.文章中有错误之处,欢迎拍砖和指点.特别感谢"java1234知识分享网"和"黑马程序员官网",所有的资料大部分是两者提供,为了方便

【管理心得之二十】你是简单的“被雇佣者”, 还是 高明的“交换者”?

场景再现 ====================== {幼儿园两个小朋友之间的对话} 小朋友A:我可以用兜兜里的糖换你的橘子吗? 小朋友B:好啊 小朋友A:给你,3块糖 小朋友B:给你,橘子 ====================== 上面两个小朋友之间的对话,诠释了最经典的物品交换过程.步入社会求生的我们,似乎很少能看到这样至淳至朴的交换,最多是借助"金钱"衡量完成一次等价的交换罢了. 说得俗套些"天下熙熙,皆为利来",没有任何人可以不计报酬为组织做事.薪资不