【PHP 模板引擎】Prototype 原型版发布!
在文章的开头,首先要向一直关注我的人说声抱歉!因为原本是打算在前端框架5.0发布之后,就立马完成 PHP 模板引擎的初版。但我没能做到,而且一直拖到了15年元旦才完成,有很严重的拖延症我很惭愧,再次抱歉!
之前有说过以后的作品发布文章都会同步发表相应的 API 使用说明,但我觉得这还不够好而且博客平台对表格的处理和显示不是很友好,导致 API 不能完美的呈现,因此打算只提供 API 链接,大家可以通过链接直接访问到我的官网去查阅手册,那样的阅读体验是最好的。而发布的文章以后则更新一些和 API 相关的使用教导,提供一些小例子,让大家在阅读 API 的同时,也能够通过实际例子去更加深刻的体会到代码的各种用法与业务逻辑思想!
以下是 API 手册与实例演示链接
【实例演示】:http://www.shibuyi.net/demo/php/template_engine/prototype
【官方 API 使用手册】:http://www.shibuyi.net/api/php/template_engine/prototype
【笔者个人官网】:http://www.shibuyi.net
下面为 PHP 模板引擎 Prototype 原型版使用教导,以下直接简称:模板引擎!
什么?不知道模板引擎是啥?可能会有 PHP 新手会问这样的问题,那我就简单的回答一下吧。模板引擎其实就是 PHP 的一个中间件技术,让传统的 Web 动态网站编程变得更加轻松,为什么这么说呢?以前不轻松吗?那是因为在模板引擎出现之前,几乎所有的 Web 服务端程序员都是通过混编代码完成工作的,所谓混编就是一张页面中既包含:PHP 也包含 HTML 甚至还有其他语言的代码,因此项目如果逐渐扩展,开发和维护的时间成本是极高的,还容易出错,美工与程序也不好配合,如果美工一点也不理解程序,那基本上没办法看混编文件。而模板引擎的诞生就很好的解决了这一难题。它采用模板技术将混编文件中的 PHP 业务逻辑层代码与 HTML 表现层代码进行了很好的切割分离,程序员则可以安心的设计程序,而美工则安心的设计界面,二者之间会使用一种模板标记的特殊符号进行关联,方便模板引擎读取模板文件之后可以顺利的进行编译操作。市面上 PHP 已经有很多相当成熟的模板引擎了,如:Smarty 模板引擎等等,其他 Web 服务端语言也有自己相应的模板引擎,或者与模板引擎类似的中间件技术。
关于模板引擎的详细介绍,推荐大家访问百度百科:http://baike.baidu.com/view/4258079.htm
在学习模板引擎之前大家要先保证自己已经了解了 PHP 的 OOP(面向对象编程)思想,因为模板技术是采用 OOP 思想描述的,如果不懂 OOP 那么这篇文章就不适合您阅读,因为门槛过高!
首先大家看到的图片是模板引擎的目录结构图(笔者使用的是 ZendStudio 7.2.1 集成开发环境):
1. caches 为模板缓存目录(若不存在模板引擎第一次执行会自动生成);
2. classes 为模板引擎核心类库;
3. compiles 为模板编译目录(若不存在模板引擎第一次执行会自动生成);
4. constants 为模板常量目录(若不存在模板引擎第一次执行会自动生成);
5. includes 为模板配置目录;
6. templates 为模板文件目录(若不存在模板引擎第一次执行会自动生成)。
在了解了模板引擎的目录后,接下来我们就来看看如何让他运作起来。在原型版中模板引擎的相关初始化和配置信息都是在 includes/template.inc.php 文件中完成的(大家可以打开实例演示的源码进行查阅)。
其实对模板引擎的配置又叫做初始化的过程,初始化的第一步就是配置相应的目录,让模板引擎能够正确的读取和写入该目录中的数据(配置步骤大家可以自由选择,不一定非要按照我的顺序来配置,但一定要在实例化模板引擎之前完成,否则将会失效),而我们则假设与模板引擎在同一目录下进行配置,并且创建 index.php 文件用来存储配置信息,如果非同一目录对于根目录的配置则需要注意调整。
1. 首先第一步是配置模板引擎的根目录,如果不设置则会自动生成根目录的绝对路径。
Template :: <span style="color: #800080;">$rootPath</span> = <span style="color: #008080;">dirname</span>(<span style="color: #ff00ff;">__FILE__</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 相对与绝对路径均可,我们这里则采用绝对路径!如:"C:/wwwroot/prototype"</span>
2. 配置模板文件目录,这个目录是用来存放模板文件的,如果不设置则默认为:templates 目录。
<span style="color: #008000;">//</span><span style="color: #008000;"> 这里则采用默认目录,大家根据自己的需求进行设置,建议不要写中文容易出错,目录名的前后加不加正反斜杠都无所谓,最终模板引擎内部会自动校正!</span>Template :: <span style="color: #800080;">$templateName</span> = '/templates/';
3. 配置编译文件目录,这是用来存储模板文件被解析后生成的编译文件,如果不设置则默认为:compiles 目录。
Template :: <span style="color: #800080;">$compileName</span> = '/compiles/'; <span style="color: #008000;">//</span><span style="color: #008000;"> 和模板目录一样也采用默认目录。</span>
4. 配置缓存文件目录,这是在模板引擎开启缓存功能后,用来存储编译文件生成的缓存文件,如果不设置默认为:caches 目录。
Template :: <span style="color: #800080;">$cacheName</span> = '/caches/'; <span style="color: #008000;">//</span><span style="color: #008000;"> 一样使用默认</span>
5. 配置模板常量目录,可能大家不太理解模板常量是用来干嘛的,和普通的 PHP 常量又有什么区别?关于模板常量的解释,在接下来的运用中我们在详细探讨,这里就先跟我进行配置即可,如果不设置则默认为:constants 目录。
Template :: <span style="color: #800080;">$constantName</span> = '/constants/'; <span style="color: #008000;">//</span><span style="color: #008000;"> 使用默认</span>
6. 到第六步为止,目录的配置就全部完成了,大家不用担心目录不存在的问题,也无需手动去创建,模板引擎内部会自动帮我们完成。那么接下来就是设置模板常量的文件名称,如果不设置则默认为:default.xml 文件,和目录一样不存在模板引擎会自动创建。
<span style="color: #008000;">//</span><span style="color: #008000;"> 我们也采用默认,但大家要注意的是这里必须采用 .xml 为扩展名,因为常量文件是以 XML 标记描述的,如果不是 .xml 结尾,那么可能会导致模板引擎在处理常量时出现异常情况!</span>Template :: <span style="color: #800080;">$constantFile</span> = 'default.xml';
7. 设置缓存开关,缓存默认情况下是被关闭的,只有我们去设置他,才会开启。
<span style="color: #008000;">//</span><span style="color: #008000;"> 大家注意,这里我写的是一个布尔值,其实这里可以填写任意值,最终都会被隐式转换为布尔值,写 0 或 1 都可以,我直接写布尔值是为了方便大家的理解!</span>Template :: <span style="color: #800080;">$cacheSwitch</span> = <span style="color: #0000ff;">true</span>;
8. 至此模板引擎的配置基本上就已经全部完成了,还是很简单的。现在我们只需要实例化出模板引擎对象,就可以真正的运行模板引擎了。
<span style="color: #800080;">$tpl</span> = <span style="color: #0000ff;">new</span> Template(); <span style="color: #008000;">//</span><span style="color: #008000;"> 实例化出模板引擎,从这一步开始之前的所有配置全部生效,模板引擎实例化时不需要传递任何参数。</span>
9. 在实例化出模板引擎对象以后,我们就可以开始对其进行操作,那么对谁进行操作呢?当然是模板文件了,首先我们要先创建模板文件。在模板文件目录中进行创建。模板文件其实是纯 HTML 代码文件,扩展名可以自定义,而我们约定俗成,都以 .tpl 为扩展名。假设我们已经创建了一个模板文件名为:index.tpl,因为和我们的 php 业务逻辑文件 index.php 同名,这也是按照惯例约定俗成,因为 index.php 文件调用 index.tpl 模板,见名知意。
10. 在创建了模板文件之后,我们就可以在业务文件(之前的配置也都是在 index.php 中执行的)中进行对模板文件的加载以及注入模板变量,关于模板变量和其他的模板标识符(又统称模板标记)将在接下来的步骤中逐一讲解。
<span style="color: #008000;">//</span><span style="color: #008000;"> 注入变量的格式有两种,大家注意看 API 手册的说明,数组格式与传统的键值对格式均可以,我们两种都使用一下。</span><span style="color: #800080;">$tpl</span> -> assign('title', '头衔'); <span style="color: #008000;">//</span><span style="color: #008000;"> 首先是传统键值对格式</span><span style="color: #800080;">$tpl</span> -> assign(<span style="color: #0000ff;">array</span>('title' => '头衔', 'name' => '名称')); <span style="color: #008000;">//</span><span style="color: #008000;"> 数组格式明显要更加好用一些,因为在注入多个变量时,就可以不用写多个注入语句,一句话就搞定了。// 如果出现了两个一模一样的变量名称,那么其后会将之前的给替换掉。以下代码,最终 language 变量的值为:英文。</span><span style="color: #800080;">$tpl</span> -> assign(<span style="color: #0000ff;">array</span>('language' => '中文', 'language' => '英文'<span style="color: #000000;">));</span><span style="color: #008000;">//</span><span style="color: #008000;"> 接下来是加载模板文件,直接写模板名称即可,模板引擎会自动锁定到模板文件目录。</span><span style="color: #800080;">$tpl</span> -> display('index.tpl');
11. 至此对模板引擎的操作就结束了,接下来我们将熟悉一下模板文件中的各个模板标记的使用方法,他们都是用来做什么的。在原型版中模板标记一共有 9 种,分别为:1. 模板变量、2. 模板常量、3. 单行模板注释、4. 多行模板注释、5. include 文件加载、6. template 模板文件加载、7. source 源模板文件加载(较为特殊)、8. if 分歧语句、9. foreach 循环语句。那么我们首先解释一下模板变量吧。
<span style="color: #0000ff;"><span style="color: #800000;">div </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="main"</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 刚刚我们注入了 title 变量,那么在模板文件中就可以对其进行调用了,调用方法就是保持同名,按照这样的格式抒写即可{$模板变量名称}</span><span style="color: #008000;">--></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 模板变量的命名规范与 PHP 普通变量一模一样,首位不能为数字,且区分大小写,注意保证格式的正确性,如果错误模板引擎将不会对其进行解析 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="###"</span><span style="color: #0000ff;">></span>{$title}<span style="color: #0000ff;"></span><span style="color: #800000;">a</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式,被正确解析 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="###"</span><span style="color: #0000ff;">></span>{$123}<span style="color: #0000ff;"></span><span style="color: #800000;">a</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的格式,无法解析 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"></span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span></span></span></span>
12. 下面是模板常量的使用,模板常量和 PHP 常量虽然名字上都叫他常量,其实本质上并非一回事。模板常量其实可以看做是伪常量,而并非真正的常量,他是通过对 XML 标记的储存,来实现一种全局不变的特定值,这些值需要手动的添加到常量文件中。(手动添加其实不太方便,笔者会在其后的版本迭代中,加入自动添加的功能)
首先我们需要在模板常量文件中手动添加模板常量,代码如下:
<span style="color: #0000ff;"></span><span style="color: #ff00ff;">xml version="1.0" coding="utf-8" </span><span style="color: #0000ff;">?></span><span style="color: #0000ff;"><span style="color: #800000;">root</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 必须在 root 根标记中间进行添加,而且一个标记字母都不能出错,注意区分大小写,如果不慎写错,模板引擎将无法对其进行获取 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><span style="color: #800000;">constant</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><span style="color: #800000;">key</span><span style="color: #0000ff;">></span>WEBNAME<span style="color: #0000ff;"></span><span style="color: #800000;">key</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 这里填写常量名称注意字母必须全部大写,第一位不能为数字,格式与 PHP 定义常量一样 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><span style="color: #800000;">value</span><span style="color: #0000ff;">></span>网站标题<span style="color: #0000ff;"></span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 常量值 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"></span><span style="color: #800000;">constant</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><span style="color: #800000;">constant</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><span style="color: #800000;">key</span><span style="color: #0000ff;">></span>123abc<span style="color: #0000ff;"></span><span style="color: #800000;">key</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的常量名 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><span style="color: #800000;">value</span><span style="color: #0000ff;">></span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 值可以为空 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"></span><span style="color: #800000;">constant</span><span style="color: #0000ff;">></span><span style="color: #0000ff;"></span><span style="color: #800000;">root</span><span style="color: #0000ff;">></span></span></span></span></span></span></span></span>
配置好常量后,接下来就是在模板文件中进行调用,代码如下:
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 模板常量的调用和变量类似,只是取消了 $ 符号,另外和配置的常量名要保持一致 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">title</span><span style="color: #0000ff;">></span>{WEBANME}<span style="color: #0000ff;"></span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的名称,将被正确解析 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>{NAME}<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 虽然格式正确,但刚才没有进行 NAME 常量的配置,因此最终解析后会返回一个空值 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>{abc123}<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的名称,无法解析 </span><span style="color: #008000;">--></span></span></span></span>
13. 下面是模板的注释符,有两种:一种为单行,一种为多行。常用于对模板文件代码的注解,可以让美工配合设计界面的时候了解代码的实际含义。
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 大家可以把模板注释放到 HTML 注释符号中,这样美工在设计模板页面的时候会更加一目了然。</span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 单行注释的格式是:{@}内容可写可不写,但不写也就没有意义了 </span><span style="color: #008000;">--></span><span style="color: #000000;">{@ 普通的单行注释} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式 </span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> {@ HTML 注释符号中的单行注释} </span><span style="color: #008000;">--></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式 </span><span style="color: #008000;">--></span><span style="color: #000000;">{@ 换行的单行注释} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 格式错误,单行注释无法换行,模板引擎无法解析 </span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 多行注释的格式是:{#}...{/#}一头一尾要呼应,内容也可以不写 </span><span style="color: #008000;">--></span><span style="color: #000000;">{#}这是多行注释,注意首位呼应!{/#} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式 </span><span style="color: #008000;">--></span><span style="color: #000000;">{#}这是多行注释,我换行了!{/#} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式 </span><span style="color: #008000;">--></span><span style="color: #000000;">{#} 没有写结尾符号 </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的格式,模板引擎无法解析 </span><span style="color: #008000;">--></span>
14. 模板加载标识符,加载方式分为 3 类,别分为:include 对普通文件的直接加载;template 对模板文件进行编译后加载;source 对模板文件进行编译后直接输出编译文件的路径(此方法较为特殊且并不完美,需要在特定的场合中使用,比如:框架页面的调用)
首先是对普通文件的加载调用,代码如下:
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 注意抒写格式,被直接加载的文件多半是 php 文件,且文件必须要存在,不存在的文件,模板引擎将会给出一个错误提示,并且终止代码的执行 </span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 文件名前后的引号,单双引号都可以,但必须保持一致,不能一单一双,否则模板引擎将不会对其解析 </span><span style="color: #008000;">--></span><span style="color: #000000;">{include path = "test.php"} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式,将被解析 </span><span style="color: #008000;">--></span><span style="color: #000000;">{include path = 'abc.php"} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的格式,无法被解析 </span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 如果出现了同一个文件被加载了两次,那么模板引擎只会对其加载第一次后,自动忽略其后的加载 </span><span style="color: #008000;">--></span><span style="color: #000000;">{include path = "123.php"} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 第一次被加载成功 </span><span style="color: #008000;">--></span><span style="color: #000000;">{include path = "123.php"} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 与上一个文件同属一个文件,将无法被再次加载,而被自动忽略 </span><span style="color: #008000;">--></span>
下面是对模板文件的编译加载,代码如下:
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 格式与 include 方式基本一样,就不重复阐述了,不一样的是 include 是需要给出具体的路径地址,而 template 则只需要给出模板名称即可,模板引擎会自动找到该模板文件 </span><span style="color: #008000;">--></span><span style="color: #000000;">{template path = 'test.tpl'} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 正确的格式,将会被编译后加载 </span><span style="color: #008000;">--></span>
最后就是模板文件的编译地址的输出,该功能较特殊,即使不理解也没关系,该方法有严重的 BUG 尚未处理完毕,因此并不完美,且使用的概率也极低,这里只做简单的介绍。在其后的版本迭代中,是否会保留并完善,尚在定夺,代码如下:
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 这里我们将使用 iframe 框架页面,来调用 source 加载方法,调用格式与前两种雷同,就不在阐述 </span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 这样使用其实就可以了,但有严重的 BUG 出现,原因是所有在 frame.tpl 中注入的模板标记被解析后,将无法找到源头,也就是说 php 将无法对其正确处理,并且因为无法找到源头,而会报错,该 BUG 的解决方案还在研究中,这里仅提供给大家思考 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">iframe </span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">="{source path = 'frame.tpl'}"</span><span style="color: #0000ff;">></span><span style="color: #800000;">iframe</span><span style="color: #0000ff;">></span></span>
15. 接下来是经常会被用到的 if 分歧语句,他和 php 的 if 语句很类似,但功能上却很简单,且不支持多重判断以及嵌套判断,但我会在其后的版本迭代中让其功能逐步强大。
<span style="color: #008000;"><!--</span><span style="color: #008000;"> if 语句的格式其实和多行注释一样,一定要注意首位呼应,但大小写无所谓都能够支持和 PHP 原生的 if 语句是一样的。 </span><span style="color: #008000;">--></span><span style="color: #000000;">{if $action} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 只要被注入的 {$action} 变量的值为 true,或隐式转换后为 true,那么 if 语句中的代码将被显示 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>界面1<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span><span style="color: #000000;">{/if}{if !$action} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 加入了逻辑非的判断,只要为 false 则被显示 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>界面2<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span><span style="color: #000000;">{/if}{if $action} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 双层判断的时候,为 true 时显示界面1,为 false 时显示界面2 </span><span style="color: #008000;">--></span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>界面1<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span><span style="color: #000000;">{else}</span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>界面2<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span><span style="color: #000000;">{/if}{if $action} </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的格式,没有结尾,不会被模板引擎解析 </span><span style="color: #008000;">--></span></span></span></span></span>
16. 终于到了最后的也是最复杂的 foreach 循环语句的调用了,其功能和 PHP 一样,只是格式上稍有改动。
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 注意在调用 foreach 和 if 语句一样要首尾呼应,而且如果变量不是数组格式,那么 php 将会自动报出一个错误 </span><span style="color: #008000;">--></span><span style="color: #008000;"><!--</span><span style="color: #008000;"> 其中 $array 就是被注入的模板变量,注意要是数组格式;而 key 和 value 则是对应数组中的键值对,必须写,否则格式不正确,将无法被模板引擎解析 </span><span style="color: #008000;">--></span><span style="color: #000000;">{foreach $array(key, value)} </span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>{%key} ... {%value}<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 注意键值对可以不是 key 和 value,但一定要和之前同名,否则无法被解析 </span><span style="color: #008000;">--></span><span style="color: #000000;">{/foreach}{foreach $userList(id, username)} </span><span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>{%id} ... {%username}<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 自定义的键值对,格式正确 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><span style="color: #800000;">p</span><span style="color: #0000ff;">></span>{%password}<span style="color: #0000ff;"></span><span style="color: #800000;">p</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 错误的格式,并没有被定义,因此无法被解析 </span><span style="color: #008000;">--></span><span style="color: #000000;">{/foreach}</span></span></span></span>
好了,写到这里我也可以长长的舒口气,模板引擎原型版的教导到此就结束了。虽然教导文章已经很详细了,但建议大家配合 API 手册和实例代码进行参照阅读,这样效果会更好更便于理解和掌握。当然因为是文章,所以即使你描述的再详细,文字也是抽象的,需要大家多动手,而对于动手能力较差的新手们,这篇教导文章则起不到多大的作用,可能反而会被弄得一头雾水,甚至最终对此厌恶,所以我有想过如果以后有可能,在版本迭代更新到一定程度后,我会针对性的出一套系列教导视频,那样的话就不会像文字这样抽象,新手也能够很快的学习。
如果你是从头看到尾,那么我真心感谢您的阅览,我想你应该有什么话想说,请一定要在下面留言告诉我,有问题也请及时留言,感谢各位的支持~!
- 1楼悲惨的大爷
- 学习下源码

“你的组织要求你更改PIN消息”将显示在登录屏幕上。当在使用基于组织的帐户设置的电脑上达到PIN过期限制时,就会发生这种情况,在该电脑上,他们可以控制个人设备。但是,如果您使用个人帐户设置了Windows,则理想情况下不应显示错误消息。虽然情况并非总是如此。大多数遇到错误的用户使用个人帐户报告。为什么我的组织要求我在Windows11上更改我的PIN?可能是您的帐户与组织相关联,您的主要方法应该是验证这一点。联系域管理员会有所帮助!此外,配置错误的本地策略设置或不正确的注册表项也可能导致错误。即

Windows11将清新优雅的设计带到了最前沿;现代界面允许您个性化和更改最精细的细节,例如窗口边框。在本指南中,我们将讨论分步说明,以帮助您在Windows操作系统中创建反映您的风格的环境。如何更改窗口边框设置?按+打开“设置”应用。WindowsI转到个性化,然后单击颜色设置。颜色更改窗口边框设置窗口11“宽度=”643“高度=”500“>找到在标题栏和窗口边框上显示强调色选项,然后切换它旁边的开关。若要在“开始”菜单和任务栏上显示主题色,请打开“在开始”菜单和任务栏上显示主题

默认情况下,Windows11上的标题栏颜色取决于您选择的深色/浅色主题。但是,您可以将其更改为所需的任何颜色。在本指南中,我们将讨论三种方法的分步说明,以更改它并个性化您的桌面体验,使其具有视觉吸引力。是否可以更改活动和非活动窗口的标题栏颜色?是的,您可以使用“设置”应用更改活动窗口的标题栏颜色,也可以使用注册表编辑器更改非活动窗口的标题栏颜色。若要了解这些步骤,请转到下一部分。如何在Windows11中更改标题栏的颜色?1.使用“设置”应用按+打开设置窗口。WindowsI前往“个性化”,然

您是否在Windows安装程序页面上看到“出现问题”以及“OOBELANGUAGE”语句?Windows的安装有时会因此类错误而停止。OOBE表示开箱即用的体验。正如错误提示所表示的那样,这是与OOBE语言选择相关的问题。没有什么可担心的,你可以通过OOBE屏幕本身的漂亮注册表编辑来解决这个问题。快速修复–1.单击OOBE应用底部的“重试”按钮。这将继续进行该过程,而不会再打嗝。2.使用电源按钮强制关闭系统。系统重新启动后,OOBE应继续。3.断开系统与互联网的连接。在脱机模式下完成OOBE的所

任务栏缩略图可能很有趣,但它们也可能分散注意力或烦人。考虑到您将鼠标悬停在该区域的频率,您可能无意中关闭了重要窗口几次。另一个缺点是它使用更多的系统资源,因此,如果您一直在寻找一种提高资源效率的方法,我们将向您展示如何禁用它。不过,如果您的硬件规格可以处理它并且您喜欢预览版,则可以启用它。如何在Windows11中启用任务栏缩略图预览?1.使用“设置”应用点击键并单击设置。Windows单击系统,然后选择关于。点击高级系统设置。导航到“高级”选项卡,然后选择“性能”下的“设置”。在“视觉效果”选

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

在Windows11上的显示缩放方面,我们都有不同的偏好。有些人喜欢大图标,有些人喜欢小图标。但是,我们都同意拥有正确的缩放比例很重要。字体缩放不良或图像过度缩放可能是工作时真正的生产力杀手,因此您需要知道如何对其进行自定义以充分利用系统功能。自定义缩放的优点:对于难以阅读屏幕上的文本的人来说,这是一个有用的功能。它可以帮助您一次在屏幕上查看更多内容。您可以创建仅适用于某些监视器和应用程序的自定义扩展配置文件。可以帮助提高低端硬件的性能。它使您可以更好地控制屏幕上的内容。如何在Windows11

Windows上的激活过程有时会突然转向显示包含此错误代码0xc004f069的错误消息。虽然激活过程已经联机,但一些运行WindowsServer的旧系统可能会遇到此问题。通过这些初步检查,如果这些检查不能帮助您激活系统,请跳转到主要解决方案以解决问题。解决方法–关闭错误消息和激活窗口。然后,重新启动计算机。再次从头开始重试Windows激活过程。修复1–从终端激活从cmd终端激活WindowsServerEdition系统。阶段–1检查Windows服务器版本您必须检查您使用的是哪种类型的W


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Dreamweaver CS6
Alat pembangunan web visual

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini