>  기사  >  백엔드 개발  >  [PHP 템플릿 엔진] 프로토타입 프로토타입 버전 출시!

[PHP 템플릿 엔진] 프로토타입 프로토타입 버전 출시!

WBOY
WBOY원래의
2016-08-08 09:31:48877검색

글의 시작 부분에서 먼저 저를 팔로우해주시는 분들께 죄송하다는 말씀 전하고 싶습니다! 원래는 프론트엔드 프레임워크 5.0 출시 직후 PHP 템플릿 엔진의 첫 번째 버전을 완성할 계획이었기 때문입니다. 그런데 그러지 못하고 2015년 새해가 되어서야 완성하게 되었어요. 심각하게 미루었던 것이 너무 부끄럽고, 다시 한번 죄송합니다!

앞으로 기사를 게시할 때 해당 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의 미들웨어 기술입니다. 예전에는 쉽지 않았나요? 템플릿 엔진이 등장하기 전에는 거의 모든 웹 서버 프로그래머가 혼합 코드를 통해 작업을 완료했기 때문입니다. 소위 혼합 코드는 페이지에 PHP, HTML 및 심지어 다른 언어의 코드도 포함되어 있음을 의미합니다. 확장하면 개발 및 유지 관리에 소요되는 시간 비용이 극도로 높을 뿐만 아니라 오류가 발생하기 쉽고, 아티스트가 프로그램을 전혀 이해하지 못하면 기본적으로 읽기가 불가능합니다. 혼합된 파일입니다. 템플릿 엔진의 탄생으로 이 문제가 아주 잘 해결되었습니다. 템플릿 엔진 기술을 사용하여 혼합 파일에서 PHP 비즈니스 로직 레이어 코드와 프리젠테이션 레이어 코드 HTML을 잘 분리합니다. 프로그래머는 안심하고 프로그램을 디자인할 수 있으며, 아티스트는 안심하고 인터페이스를 디자인할 수 있습니다. 태그는 템플릿 엔진이 템플릿 파일을 읽은 후 원활하게 컴파일할 수 있도록 연결에 사용됩니다. 이미 시장에는 Smarty 템플릿 엔진 등과 같이 꽤 성숙한 PHP용 템플릿 엔진이 많이 나와 있습니다. 다른 웹 서버 언어에도 자체적으로 해당하는 템플릿 엔진이나 템플릿 엔진과 유사한 미들웨어 기술이 있습니다.

템플릿 엔진에 대한 자세한 소개를 보려면 Baidu Encyclopedia를 방문하는 것이 좋습니다: http://baike.baidu.com/view/4258079.htm

템플릿 엔진을 배우기 전에 먼저 PHP의 OOP(객체 지향 프로그래밍) 사고를 이해했는지 확인해야 합니다. 템플릿 기술은 OOP 사고를 사용하여 설명하기 때문입니다. OOP를 이해하지 못한다면 이 기사는 아닙니다. 임계값이 너무 높기 때문에 읽기에 적합합니다!

첫 번째 사진은 템플릿 엔진의 디렉토리 구조 다이어그램입니다(저자는 ZendStudio 7.2.1 통합 개발 환경을 사용하고 있습니다).

1. 캐시는 템플릿 캐시 디렉터리입니다(템플릿 엔진이 없으면 처음으로 자동 생성됩니다).

2. 클래스는 템플릿 엔진의 핵심 클래스 라이브러리입니다.

3. compiles는 템플릿 컴파일 디렉터리입니다(템플릿 엔진이 없으면 처음으로 자동 생성됩니다).

4. 상수는 템플릿 상수 디렉터리입니다(템플릿 엔진이 없으면 처음으로 자동 생성됩니다).

5. 템플릿에 대한 디렉터리를 구성합니다.

6. 템플릿은 템플릿 파일 디렉터리입니다(템플릿 엔진이 없으면 처음으로 자동 생성됩니다).

템플릿 엔진의 디렉터리를 이해한 후, 어떻게 작동하게 되는지 살펴보겠습니다. 프로토타입 버전에서는 템플릿 엔진의 관련 초기화 및 구성 정보가 include/template.inc.php 파일에 완료됩니다(소스 코드를 열어 확인할 수 있음).

실제로 템플릿 엔진의 구성을 초기화 프로세스라고도 합니다. 초기화의 첫 번째 단계는 템플릿 엔진이 디렉터리의 데이터를 올바르게 읽고 쓸 수 있도록 해당 디렉터리를 구성하는 것입니다(자유롭게 선택할 수 있음). 구성 단계는 아니요 내 순서에 따라 구성해야 하지만 템플릿 엔진을 인스턴스화하기 전에 완료해야 합니다. 그렇지 않으면 유효하지 않습니다.) 구성이 템플릿 엔진과 동일한 디렉터리에 있다고 가정합니다. 동일한 디렉터리가 아닌 경우 루트 디렉터리의 구성을 조정하는 데 주의가 필요합니다.

1. 첫 번째 단계는 템플릿 엔진의 루트 디렉터리를 구성하는 것입니다. 설정하지 않으면 루트 디렉터리의 절대 경로가 자동으로 생성됩니다.

2. 템플릿 파일 디렉터리를 구성합니다. 이 디렉터리는 템플릿 파일을 저장하는 데 사용됩니다. 설정되지 않은 경우 기본값은 템플릿 디렉터리입니다.

Template :: <span>$rootPath</span> = <span>dirname</span>(<span>__FILE__</span>); <span>//</span><span> 相对与绝对路径均可,我们这里则采用绝对路径!如:"C:/wwwroot/prototype"</span>

3. 配置编译文件目录,这是用来存在模板文件被解析后生成的编译文件,如果不设置则默认为:compiles 目录。

Template :: <span>$compileName</span> = '/compiles/'; <span>//</span><span> 和模板目录一样也采用默认目录。</span>

4. 配置缓存文件目录,这是在模板引擎开启缓存功能后,用来存在编译文件生成的缓存文件,如果不设置默认为:caches 目录。

Template :: <span>$cacheName</span> = '/caches/'; <span>//</span><span> 一样使用默认</span>

5. 配置模板常量目录,可能大家不太理解模板常量是用来干嘛的,和普通的PHP常量有什么区别吗?关于模板常量的解释,在接下来的运用在我们在详细探讨,这里就先跟我进行配置即可,如果不设置默认为:constants 目录。

Template :: <span>$constantName</span> = '/constants/'; <span>//</span><span> 使用默认</span>

6. 到第六步为止,目录的配置就全部完成了,大家不用担心目录不存在的问题,也不用手动去创建,模板引擎内部会自动帮我们完成。那么接下来就是设置模板常量的文件名称,如果不设置则默认为:default.xml 文件。

<span>//</span><span> 我们也采用默认,但大家要注意的是这里必须采用 .xml 为扩展名,因为常量文件是以 XML 标记描述的,如果不是 .xml 结尾,那么可能会导致模板引擎在处理常量时出现异常情况!</span>
Template :: <span>$constantFile</span> = 'default.xml';

7. 设置缓存开关,缓存默认情况下是被关闭的,只有我们去设置他,才会开启。

<span>//</span><span> 大家注意,这里我写的是一个布尔值,其实这里可以填写任意值,最终都会被隐式转换为布尔值,写 0 或 1 都可以,我直接写布尔值是为了方便大家的理解!</span>
Template :: <span>$cacheSwitch</span> = <span>true</span>;

8. 至此模板引擎的配置基本上就已经全部完成了,还是很简单的。现在我们只需要实例化出模板引擎对象,就可以真正的运行模板引擎了。

<span>$tpl</span> = <span>new</span> Template(); <span>//</span><span> 实例化出模板引擎,从这一步开始之前的配置全部生效,模板引擎实例化时不需要传递任何参数。</span>

9. 在实例化出模板引擎对象以后,我们就可以开始对其进行操作,那么对谁进行操作呢?当然是模板文件了,首先我们要先创建模板文件。在模板文件目录中进行创建。模板文件其实是纯 HTML 代码文件,扩展名可以自定义,而我们约定俗成,都已 .tpl 为扩展名。假设我们已经创建了一个模板文件名为:index.tpl,因为和我们的 php 业务逻辑文件 index.php 同名,这也是按照惯例约定俗成,因为 index.php 文件调用 index.tpl 模板,见名知意。

10. 在创建了模板文件之后,我们就可以在业务文件(之前的配置也都是在 index.php 中执行的)中进行对模板文件的加载以及注入模板变量,关于模板变量和其他的模板标识符(又统称模板标记)将在接下来的步骤中逐一讲解。

<span>//</span><span> 注入变量的格式有两种,大家注意看 API 手册的说明,数组格式与传统的键值对格式均可以,我们两种都使用一下。</span>
<span>$tpl</span> -> assign('title', '头衔'); <span>//</span><span> 首先是传统键值对格式</span>

<span>$tpl</span> -> assign(<span>array</span>('title' => '头衔', 'name' => '名称')); <span>//</span><span> 数组格式明显要更加好用一些,因为在注入多个变量时,就可以不用写多个注入语句,一句话就搞定了。

// 如果出现了两个一模一样的变量名称,那么其后会将之前的给替换掉。以下代码,最终 language 变量的值为:英文。</span>
<span>$tpl</span> -> assign(<span>array</span>('language' => '中文', 'language' => '英文'<span>));

</span><span>//</span><span> 接下来是加载模板文件,直接写模板名称即可,模板引擎会自动锁定到模板文件目录。</span>
<span>$tpl</span> -> display('index.tpl');

11. 至此对模板引擎的操作就结束了,接下来我们将熟悉一下模板文件中的各个模板标记的使用方法,他们都是用来做什么的。在原型版中模板标记一共有 9 种,分别为:1. 模板变量、2. 模板常量、3. 单行模板注释、4. 多行模板注释、5. include 文件加载、6. template 模板文件加载、7. source 源模板文件加载(较为特殊)、8. if 分歧语句、9. foreach 循环语句。那么我们首先解释一下模板变量吧。

<span><</span><span>div </span><span>id</span><span>="main"</span><span>></span>
    <span><!--</span><span> 刚刚我们注入了 title 变量,那么模板在模板文件中就可以对其进行调用了,调用方法就是保持同名,按着这样的格式抒写即可{$模板变量名称}</span><span>--></span>
    <span><!--</span><span> 模板变量的命名规范与 PHP 普通变量一模一样,首位不能为数字,且区分大小写,注意保证格式的正确性,如果错误模板引擎将不会对其进行解析 </span><span>--></span>
    <span><</span><span>a </span><span>href</span><span>="###"</span><span>></span>{$title}<span></</span><span>a</span><span>></span> <span><!--</span><span> 正确的格式,被正确解析 </span><span>--></span>
    <span><</span><span>a </span><span>href</span><span>="###"</span><span>></span>{$123}<span></</span><span>a</span><span>></span> <span><!--</span><span> 错误的格式,无法解析 </span><span>--></span>
<span></</span><span>div</span><span>></span>

12. 下面是模板常量的使用,模板常量和 PHP 常量虽然名字上都叫他常量,其实本质上并非一回事。模板常量其实看以看做是伪常量,而并非真正的常量,他是通过对 XML 标记的处理,来保持一组特定不变的值,这些值需要手动的添加到常量文件中。(手动添加其实不太方便,笔者会在其后的版本迭代中,加入自动添加的功能)

首先我们需要在模板常量文件中手动添加模板常量,代码如下:

<span><?</span><span>xml version="1.0" coding="utf-8" </span><span>?></span>
<span><</span><span>root</span><span>></span>
    <span><!--</span><span> 必须在 root 根标记中间进行添加,而且一个标记字母都不能出错,注意区分大小写,如果不慎写错,模板引擎将无法对其进行获取 </span><span>--></span>
    <span><</span><span>constant</span><span>></span>
        <span><</span><span>key</span><span>></span>WEBNAME<span></</span><span>key</span><span>></span> <span><!--</span><span> 这里填写常量名称注意字母必须全部大写,第一位不能为数字,格式与 PHP 定义常量一样 </span><span>--></span>
        <span><</span><span>value</span><span>></span>网站标题<span></</span><span>value</span><span>></span> <span><!--</span><span> 值可以为空 </span><span>--></span>
    <span></</span><span>constant</span><span>></span>
    
    <span><</span><span>constant</span><span>></span>
        <span><</span><span>key</span><span>></span>123abc<span></</span><span>key</span><span>></span> <span><!--</span><span> 错误的常量名 </span><span>--></span>
        <span><</span><span>value</span><span>></</span><span>value</span><span>></span> <span><!--</span><span> 空值 </span><span>--></span>
    <span></</span><span>constant</span><span>></span>
<span></</span><span>root</span><span>></span>

 配置好常量后,接下来就是在模板文件中进行调用,代码如下:

<span><!--</span><span> 模板常量的调用和变量类似,只是取消了 $ 符号,另外常量名要保持一致 </span><span>--></span>
<span><</span><span>title</span><span>></span>{WEBANME}<span></</span><span>title</span><span>></span> <span><!--</span><span> 正确的名称,将被正确解析 </span><span>--></span>
<span><</span><span>p</span><span>></span>{NAME}<span></</span><span>p</span><span>></span> <span><!--</span><span> 虽然格式正确,但刚才没有进行 NAME 常量的配置,因此最终解析后会返回一个空值 </span><span>--></span>
<span><</span><span>p</span><span>></span>{abc123}<span></</span><span>p</span><span>></span> <span><!--</span><span> 错误的名称,无法解析 </span><span>--></span>

13. 下面是模板的注释符,有两种:一种为单行,一种为多行。多用于对模板文件代码的注解,可以让美工配合设计界面的时候了解代码的实际含义。

<span><!--</span><span> 大家可以把模板注释放到 HTML 注释中,这样美工在设置模板页面的时候会更加一目了然。</span><span>--></span>
<span><!--</span><span> 单行注释的格式是:{@}内容可写可不写,但不写也就没有意义了 </span><span>--></span><span>
{@ 普通的单行注释} </span><span><!--</span><span> 正确的格式 </span><span>--></span>
<span><!--</span><span> {@ HTML 代码中的单行注释} </span><span>--></span> <span><!--</span><span> 正确的格式 </span><span>--></span><span>
{@ 换行的
单行注释} </span><span><!--</span><span> 格式错误,单行注释无法换行,模板引擎无法解析 </span><span>--></span>

<span><!--</span><span> 多行注释的格式是:{#}...{/#}一头一尾要呼应,内容也可以不写 </span><span>--></span><span>
{#}这是多行行注释,注意首位呼应!{/#} </span><span><!--</span><span> 正确的格式 </span><span>--></span><span>
{#}这是多行行注释,
我换行了!{/#} </span><span><!--</span><span> 正确的格式 </span><span>--></span><span>
{#} 没有写结尾符号 </span><span><!--</span><span> 错误的格式,模板引擎无法解析 </span><span>--></span>

14. 模板加载标识符,加载方式分为三类,别分为:include 对普通文件的直接加载;template 对模板文件进行编译后加载;source 对模板文件进行编译后直接输出编译文件的路径(此方法较为特殊且并不完美,需要在特定的场合中使用,比如:框架页面的调用)

首先是对普通文件的加载调用,代码如下:

<span><!--</span><span> 注意抒写格式,被直接加载的文件多半是 php 文件,且文件必须要存在,不存在的文件,模板引擎将会给出一个错误提示,并且终止代码的执行 </span><span>--></span>
<span><!--</span><span> 文件名前后的引号,单双引号都可以,但必须保持一致,不能一单一双,否则模板引擎将不会对其解析 </span><span>--></span><span>
{include path = "test.php"} </span><span><!--</span><span> 正确的格式,将被解析 </span><span>--></span><span>
{include path = 'abc.php"} </span><span><!--</span><span> 错误的格式,无法被解析 </span><span>--></span>
<span><!--</span><span> 如果出现了同一个文件被加载了两次,那么模板引擎只会对其加载第一次后,自动忽略其后的加载 </span><span>--></span><span>
{include path = "123.php"} </span><span><!--</span><span> 第一次被加载成功 </span><span>--></span><span>
{include path = "123.php"} </span><span><!--</span><span> 与上一个文件同属一个文件,将无法被再次加载,而被自动忽略 </span><span>--></span>

下面是对模板文件的编译加载,代码如下:

<span><!--</span><span> 格式与 include 方式基本一样,就不重复阐述了,不一样的是 include 是需要给出具体的路径地址,而 template 则只需要给出模板名称即可,模板引擎会自动找到该模板文件 </span><span>--></span><span>
{template path = 'test.tpl'} </span><span><!--</span><span> 正确的格式,将会被编译后加载 </span><span>--></span>

最后就是模板文件的编译地址的输出,该功能较特殊,即使不理解也没关系,该方法有严重的 BUG 尚未处理完毕,因此并不完美,且使用的概率也极低,这里只做简单的介绍。在其后的版本迭代中,是否会保留并完善,尚在定夺,代码如下:

<span><!--</span><span> 这里我们将使用 iframe 框架页面,来调用 source 加载方法,调用格式与前两种雷同,就不在阐述 </span><span>--></span>
<span><!--</span><span> 这样使用其实就可以了,但又严重的 BUG 出现,原因是所有在 frame.tpl 中注入的模板标记被解析后,将无法找到源头,也就是说 php 将无法对其正确处理,并且因为无法找到源头,而会报错,该 BUG 的解决方案还在研究中,这里仅提供给大家思考 </span><span>--></span>
<span><</span><span>iframe </span><span>src</span><span>="{source path = 'frame.tpl'}"</span><span>></</span><span>iframe</span><span>></span>

15. 接下来是经常会被用到的 if 分歧语句,他和 php 的 if 语句很类似,但功能上却很简单,且不支持多重判断以及嵌套判断,但我会在其后的版本迭代中让其功能逐步强大。

<span><!--</span><span> if 语句的格式其实和多行注释一样,一定要注意首位呼应,但大小写无所谓都能够支持和 PHP 原生的 if 语句是一样的。 </span><span>--></span><span>
{if $action} </span><span><!--</span><span> 只要被注入的 {$action} 变量的值为 true,或隐式转换后为 true,那么 if 语句中的代码将被显示 </span><span>--></span>
<span><</span><span>p</span><span>></span>界面1<span></</span><span>p</span><span>></span><span>
{/if}

{if !$action} </span><span><!--</span><span> 加入了逻辑非的判断,只要为 false 则被显示 </span><span>--></span>
<span><</span><span>p</span><span>></span>界面2<span></</span><span>p</span><span>></span><span>
{/if}

{if $action} </span><span><!--</span><span> 双层判断的时候,为 true 时显示界面1,为 false 时显示界面2 </span><span>--></span>
<span><</span><span>p</span><span>></span>界面1<span></</span><span>p</span><span>></span><span>
{else}
</span><span><</span><span>p</span><span>></span>界面2<span></</span><span>p</span><span>></span><span>
{/if}

{if $action} </span><span><!--</span><span> 错误的格式,没有结尾,不会被模板引擎解析 </span><span>--></span>

16. 终于到了最后的也是复杂的 foreach 循环语句的调用了,其功能和 PHP 一样,只是格式上稍有改动。

<span><!--</span><span> 注意在调用 foreach 和 if 一样要收尾呼应,而且如果变量不是数组格式,那么 php 将会自动报出一个错误 </span><span>--></span>
<span><!--</span><span> 其中 $array 就是被注入的模板变量,注意要是数组格式;而 key 和 value 则是对于的数组中的键值对,必须写,否则格式不正确,将无法被模板引擎解析 </span><span>--></span><span>
{foreach $array(key, value)}
    </span><span><</span><span>p</span><span>></span>{%key} ... {%value}<span></</span><span>p</span><span>></span> <span><!--</span><span> 注意 key 和 value 可以自定义,但一定要同名调用,否则无法被解析 </span><span>--></span><span>
{/foreach}

{foreach $userList(id, username)}
    </span><span><</span><span>p</span><span>></span>{%id} ... {%username}<span></</span><span>p</span><span>></span> <span><!--</span><span> 自定义的 key 和 value,格式正确 </span><span>--></span>
    <span><</span><span>p</span><span>></span>{%password}<span></</span><span>p</span><span>></span> <span><!--</span><span> 错误的格式,并没有被定义,因此无法被解析 </span><span>--></span><span>
{/foreach}</span>

글을 쓰고 나면 긴 안도의 한숨을 쉴 수 있습니다. 템플릿 엔진의 프로토타입 버전에 대한 튜토리얼은 여기서 끝납니다. 튜토리얼 문서는 매우 상세하지만, 효과를 더 잘 이해하고 익히기 위해서는 API 매뉴얼 및 예제 코드와 함께 읽는 것이 좋습니다. 물론 기사이기 때문에 아무리 자세하게 설명하더라도 내용이 추상적이어서 모든 사람이 실무 능력이 부족한 초보자에게는 이 유익한 기사가 별로 쓸모가 없을 것입니다. 오히려 헷갈릴 수도 있고, 심지어 혐오스러울 수도 있기 때문에, 앞으로 가능하다면 버전 반복과 업데이트가 일정 수준에 도달한 후에 타겟 교육 영상 시리즈를 제작하고 싶다고 생각했습니다. , 텍스트 기반이 아니므로 초보자도 빠르게 배울 수 있습니다.

처음부터 끝까지 읽어주시면 정말 감사하겠습니다. 궁금한 점이 있으시면 꼭 남겨주세요. 시간에 맞춰 메시지를 보내주세요. ~!

위와 같이 [PHP 템플릿 엔진] 프로토타입의 프로토타입 버전 출시를 소개합니다! , 관련 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.