【PHPテンプレートエンジン】Prototypeプロトタイプ版を公開しました!

WBOY
リリース: 2016-08-08 09:31:48
オリジナル
877 人が閲覧しました

記事の冒頭で、まずフォローしていただいている方にお詫びを申し上げます!なぜなら、当初はフロントエンド フレームワーク 5.0 のリリース直後に PHP テンプレート エンジンの最初のバージョンが完成する予定だったからです。しかしそれはできず、完成するのに2015年の元旦までかかってしまったので、自分の本気の先延ばしぶりをとても恥ずかしく思い、また申し訳ありませんでした。

以前、記事を公開する際に対応する API の使用方法を同時に公開すると述べましたが、これでは十分ではないと考えており、ブログ プラットフォームはテーブルの処理と表示にあまりフレンドリーではないため、API が完璧に紹介されていないので、API リンクのみを提供する予定ですが、リンクから直接公式 Web サイトにアクセスしてマニュアルを確認することができ、そのような読書体験が最高です。今後、公開される記事では 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 サイト プログラミングが容易になるのはなぜでしょうか。以前は簡単ではなかったですか?なぜなら、テンプレート エンジンが登場する前は、ほとんどすべての Web サーバー プログラマーが混合コードを通じて作業を完了していたためです。いわゆる混合コードとは、ページに PHP、HTML、さらには他の言語のコードの両方が含まれることを意味します。拡張すると、開発とメンテナンスの時間コストが非常に高くなり、エラーが発生しやすくなり、アートとプログラムがうまく連携できなくなります。アーティストがプログラムをまったく理解していないと、基本的には読み取ることができません。混合ファイル。テンプレート エンジンの誕生により、この問題はうまく解決されました。テンプレート エンジン テクノロジを使用して、混合ファイル内の PHP ビジネス ロジック層のコードとプレゼンテーション層のコードを適切に分離することで、プログラマーは安心してプログラムを設計でき、アーティストは安心してインターフェイスを設計できます。テンプレート エンジンがテンプレート ファイルを読み取った後、スムーズにコンパイルできるように、関連付けに使用されます。すでに市場には、Smarty テンプレート エンジンなど、非常に成熟した PHP 用のテンプレート エンジンが多数存在します。他の Web サーバー言語にも、独自の対応するテンプレート エンジン、またはテンプレート エンジンに似たミドルウェア テクノロジがあります。

テンプレート エンジンの詳細については、Baidu 百科事典にアクセスすることをお勧めします: http://baike.baidu.com/view/4258079.htm

テンプレート エンジンを学習する前に、まず PHP の OOP (オブジェクト指向プログラミング) の考え方を理解していることを確認する必要があります。OOP の考え方を使用してテンプレート テクノロジが説明されているため、OOP を理解していない場合、この記事は役に立ちません。敷居が高すぎるので読むのに最適!

最初に表示される画像は、テンプレート エンジンのディレクトリ構造図です (著者は ZendStudio 7.2.1 統合開発環境を使用しています):

1. キャッシュはテンプレート キャッシュ ディレクトリです (テンプレート エンジンが存在しない場合は、初回実行時に自動的に生成されます)。

2. クラスはテンプレート エンジンのコア クラス ライブラリです。

3.compiles はテンプレートのコンパイル ディレクトリです (テンプレート エンジンが存在しない場合は、最初の実行時に自動的に生成されます)。

4. constants はテンプレート定数ディレクトリです (テンプレート エンジンが存在しない場合は、初回実行時に自動的に生成されます)。

5. テンプレートのディレクトリを構成します。

6. templates はテンプレート ファイル ディレクトリです (テンプレート エンジンが存在しない場合は、最初の実行時に自動的に生成されます)。

テンプレート エンジンのディレクトリを理解したら、それを機能させる方法を見てみましょう。プロトタイプ バージョンでは、テンプレート エンジンの関連する初期化と構成情報が include/template.inc.php ファイルで完成します (ソース コードを開いて確認できます)。

実際、テンプレート エンジンの設定は初期化プロセスとも呼ばれます。初期化の最初のステップは、テンプレート エンジンがディレクトリ内のデータを正しく読み書きできるように、対応するディレクトリを設定することです (設定ステップは選択できます)。必ずしも必要ではありませんが、私の順序で設定する必要がありますが、テンプレート エンジンをインスタンス化する前に完了する必要があります。完了しないと無効になります)。そうでない場合は、設定がテンプレート エンジンと同じディレクトリにあるものとします。同じディレクトリにある場合は、ルート ディレクトリの構成に注意する必要があります。

1. 最初のステップは、テンプレート エンジンのルート ディレクトリを設定することです。設定されていない場合は、ルート ディレクトリへの絶対パスが自動的に生成されます。

リーリー

2. テンプレート ファイル ディレクトリを設定します。設定されていない場合、デフォルトはテンプレート ディレクトリです。

リーリー

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テンプレートエンジン】Prototypeのプロトタイプ版リリースのご紹介でした! 、関連コンテンツも含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート