很是好用的PHP模板引擎

什么是模板引擎

顾名思义,这是个模板解析的工具。他是为了解决mvc,实现数据和展现分离问题而产生的。php模板引擎由来已久,好比老大哥smarty。已经不多有人用了。毕竟如今mvc已经很成熟,不少框架都有本身的模板引擎。好比Symfony的twig,Laravel的blade。php

性能损耗?

模板引擎开始出现的时候,有不少人质疑,认为有性能问题。但其实这是没有必要的。毕竟模板引擎只是编译一次,把相应的模板语法利用正则替换成php语句,而后存储成php文件就完成任务了,后续的运行实际上是载入php文件。多出来的仅仅是一个是否存在编译文件的判断而已。对于如今的计算速度来讲能够忽略。html

为何要用模板引擎

1 从繁琐的php标签中脱离出来,从而提升代码的可读性
2 将数据处理和视图展现分离,视图只负责展现和基本的逻辑判断
3 很好的进行视图拆分,组织结构git

模板引擎比较

除了目的,还有一个不可忽视的问题,是否易学,若是一个模板引擎须要用几个小时去学习,那这样的学习成本过高了。做为一个工具应该简单易学,其次是能知足需求,功能要完善。
看一下比较主流的模板引擎的使用github

twig,他的使用语法我比较喜欢,很容易看懂,简单易学缓存

基本语法
{% for user in users %}
    * {{ user.name }}
{% else %}
    No users have been found.
{% endfor %}

指定布局文件
{% extends "layout.html" %}
定义展现块
{% block content %}
    Content of the page...
{% endblock %}复制代码

再看看bladebash

<!-- 文件保存于 resources/views/layouts/app.blade.php -->

<html>
    <head>
        <title>应用程序名称 - @yield('title')</title>
    </head>
    <body>
       @section('sidebar')
            这是 master 的侧边栏。
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

<!-- Stored in resources/views/child.blade.php -->

@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@endsection

@section('content')
    <p>This is my body content.</p>
@endsection复制代码

上面能够看出,blade就比twig复杂多了,若是不看说明,你无法理解上面代码的意思。为何没有累出smarty,由于它更复杂,如今使用的人也比较少了。mvc

咱们总结如下,一个模板引擎应该具有如下功能
1 数据块block/section 这是一个很强大的功能,能够灵活的控制每个展现块
2 继承机制parent 使用parent继承调用布局中的内容块
3 多文件组合include 利用include能够将多个模板组合到一块儿,实现多种不一样场景下的代码复用
4 灵活的变量函数以及常量使用
5 优雅的标签逻辑控制 你能够充分利用ide软件的代码提示和自动完成功能,而不须要安装特殊插件
6 模板自动监听 当模板更新时,刷新页面,模板引擎会自动进行编译,展现最新内容app

今天的主角

在具备上面总结的全部功能的前提下,看看今天的主角是怎么解决易学,可读这两个难题的。框架

布局

<!--布局文件的代码-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><block title>默认标题</block></title>
</head>
<body>
<!--展现块定义-->
<block content>我是布局模板content</block>
<!--引入模板-->
<include footer></include>
</body>
</html>

<!--内容模板-->

<!--展现块定义,会覆盖布局中的站位-->
<block title>{{ $title }}</block>
<block content>
    我是内容模板,可是我用parent标签,调用了布局文件中content的内容<br>
    <parent content></parent>
</block>复制代码

是否是清爽至极。定义不一样的block标签,灵活的控制内容和位置,内容模板的内容会默认覆盖布局文件的相同block块。还能够在内容模板,用parent标签调用布局文件中的内容。ide

使用html标签的方式进行代码书写,能够在全部ide软件中实现代码不全。上面的代码实现了展现块定义,内容模板展现块覆盖布局模板,以及继承和,外部引入include。

变量 常量 函数的使用

固然,除了对模板的整体管理,模板中还要有流程控制和变量输出。

//变量
{{ $title }}
// 函数
{{ date('Y-m-d') }}
//普一般量跟变量用法一致,须要用{{}}括起来
{{ CONST_VAR }} 

//两边下划线的常量直接使用
//会翻译为< ?php if(defined('__APP__')){echo __APP__;}else{echo '__APP__';} ?>
__APP__ 

// 三目运算
{{ $a==0 ? 0 : 1 }}复制代码

流程控制

if判断

<if$var>1)>
            大于1
        <elseif ($var==1)>
           等于1
        <else/>
            小于1
        </if>复制代码

for循环

<for ($i=0;$i<5;$i++)>
            {{ $i }}
        </for>
        普通固然for循环复制代码

for in

<for $item in $array>
            {{ $item['title'] }}
        </for>
        至关于foreach($array as $item)

        <for ($item,$index) in $array>
            {{ $index }}=>{{ $item['title'] }}
        </for>
        至关于foreach($array as $index=>$item)复制代码

foreach 跟源生php写法对应只是换成了php标签形式

<foreach ($array as $item)>
            {{ $item['title'] }}
        </foreach>
        <foreach ($array as $index=>$item)>
            {{ $index }}=>{{ $item['title'] }}
        </foreach>复制代码

php中初始化

include "../Template.php";
$view = new Template();
$view->templatePath = './template/';// 模板路径 最后以/结尾
$view->compilePath = './compile/';// 编译文件存放路径 最后以/结尾
$view->layout = 'layout';// 布局文件在末班目录下,若是不适用能够定义成空字符串或false

// 渲染模板
$view->render('index',[
    'title'=>'测试页',
    'content'=>'内容',
    'array'=>[
        1,2,3
    ]
]);
//清空缓存
//$view->clean();复制代码

喜欢的朋友欢迎star github.com/shooke/temp…

相关文章
相关标签/搜索