构建自己的PHP框架--构建模版引擎(1)

时间:2021-09-14 03:05:52

前段时间太忙,导致好久都没有更新博客了,今天抽出点时间来写一篇。

其实这个系列的博客很久没有更新了,之前想好好规划一下,再继续写,然后就放下了,今天再捡起来继续更新。

今天我们来说一下,如何构建自己的 PHP 模版引擎。现在比较流行的 PHP 模版引擎有TwigHamlLiquidMustachePlatesBlade以及比较古老的Smarty

其实关于PHP应不应该使用模版引擎,网上也有不少争论,在这里罗列一些使用模版引擎的优点。

  • 安全,比如默认转义输出
  • 可读性好

相关内容可以参考一下知乎的讨论

首先末来确定一下思路,我们先要确定在模版中使用怎样的写法,参考 Laravel 的 Blade 模板,定义如下几种简单的写法。

  • 输出变量值

{{ }} 表达式的返回值将被自动传递给 PHP 的 htmlentities 函数进行处理,以防止 XSS 攻击。

Hello, {{ $name }}!
  • 输出未转义的变量值
Hello, {!! $name !!}!
  • If 表达式

通过 @if、@elseif、@else 和 @endif 指令可以创建 if 表达式。

@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
  • 循环
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor @foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach @while (true)
<p>I'm looping forever.</p>
@endwhile
  • 引入其他视图
@include('view.name', ['some' => 'data'])

暂时先定义这么多,基本够用。如果有特殊的需要,可以自己添加,其原理基本是一致的,会写一个,其他的就都能写出来。

然后再考虑如何处理,我们定义出了这样的写法,PHP 是识别不了的,我们需要将它转化成 PHP 能够识别的样子。

举个最简单的例子,当我们拿到{{ $name }}这样一段内容时,我们只需要将它转化成<?php echo $name?>这样,就可以识别了,输出相应的变量值。

是不是很简单,好像只需要用正则替换一下就可以了,具体实现我在下一篇文章中继续说~

然后我们还有考虑到性能,每次我们都要做这样的转化,是不是很耗性能,我们可以每次都将转化后的结果缓存起来,当文件发生变化后,再重新转化,这样是不是就解决了一部分性能的问题~~

好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/1.0

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework