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


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

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

    今天我们来说一下,如何构建自己的 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

  • 相关阅读:
    一份面试题+整理的答案
    java获取本机IPV4地址,非127.0.0.1
    List去重
    禁止iframe页面时产生历史记录
    js打开新窗口并且不被拦截
    ifream 跨域实现高度自适应
    css版tooltip
    jQuery遮罩插件 jQuery.blockUI.js
    SpringMVC 传递相同名称的参数
    SpringMVC接收List型参数
  • 原文地址:https://www.cnblogs.com/CraryPrimitiveMan/p/5994801.html
Copyright © 2020-2023  润新知