第一二九天上课 PHP 自制简单开发模板

时间:2023-03-09 22:47:50
第一二九天上课 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');