什么是所谓的模板引擎

<?php
// 程序入口文件 index.php
// 重点
// 什么是“模板引擎” 模板引擎如何工作

// 设置PHP显示所有错误,除notice错误
error_reporting(E_ALL & ~E_NOTICE);

header("Content-Type: text/html; charset=utf-8");


class test
{
    protected function view($name, array $data = array())
    {
        // 模板文件路径
        $sourceFilepath = __DIR__."/{$name}.source.php";

        // 即将编译后的模板路径(实际使用的模板文件路径)
        $compliedPath = __DIR__."/{$name}.complied.php";


        // 模板文件路径文件是否存在
        if (!file_exists($sourceFilepath))
            exit("ERROR: {$sourceFilepath} not exists.");

        // 读取原始文件
        $sourceContent = file_get_contents($sourceFilepath);


        // 预设的 模板规则替换 正则规则
        $replaces = [
            '/{{([a-zA-Z0-9_$\(\)]+)}}/i' => '<?php echo $1; ?>',// 替换 {{xx}}  为 <?php echo xx; ? >
            '/@foreach\((.*)\)/i' => '<?php foreach($1): ?>',// 替换@foreach(xx) 为 <?php foreach(xx): ? >
            '/@endforeach/i' => '<?php endforeach; ?>',// 替换 @endforeach 为 <?php endforeach; ? >
        ];

        // 循环规则,开始替换模板内容
        foreach ($replaces as $regex=>$content)
        {
            $sourceContent = preg_replace($regex, $content, $sourceContent);
        }

        // 写入模板缓存
        file_put_contents($compliedPath, $sourceContent);

        extract($data);
        // 直接include 编译后的模板文件
                ob_start();
        include $compliedPath;
                return ob_get_clean();

    }

    public function index()
    {
        return $this->view('index',[
            'var1' => time(),

            'data' => [
                'k1' => 'v1',
                'k2' => 'v2',
                'k3' => 'v3'
            ]
        ]);
    }
}




$test = new test();
echo $test->index();
<!-- 模板文件 index.source.php -->
这是var1的值:{{$var1}}

<p>
    要循环的数据为
    <pre>
        {{print_r($data)}}
    </pre>
</p>

<p>
    @foreach($data as $index=>$value)
    {{$index}} => {{$value}}<br/>
    @endforeach
</p>
去打赏

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

发表评论

电子邮件地址不会被公开。