在 PHPCMS(特指其 V9 版本,这是最经典的版本)中,模板引擎是基于 libs/template.class.php 实现的,它有一套自己的标签系统,目的是将业务逻辑与页面展示分离,让不懂 PHP 的前端设计师也能制作模板。

这套标签系统分为两大类:
- 系统内置标签:由 PHPCMS 框架提供,用于调用数据、执行常用操作(如循环、判断、包含文件等)。
- PHP 原生标签:直接在模板中嵌入 PHP 代码,用于实现系统标签无法满足的复杂逻辑。
下面我们重点讲解 PHP 原生标签,这是你问题的核心。
PHP 原生标签的基本语法
PHPCMS 提供了两种在模板中直接使用 PHP 代码的方式:
{php} ... {/php}
这是最常用、最推荐的方式,它可以在模板的任何位置嵌入一段或多段 PHP 代码。
(图片来源网络,侵删)
语法格式:
{php
// 在这里写你的 PHP 代码
// 可以是多行
$my_variable = "Hello from PHP!";
echo $my_variable;
}
特点:
- 代码块形式:适用于执行一段或多行 PHP 逻辑,比如定义变量、进行复杂计算、调用非模型类的静态方法等。
- 作用域:在
{php} 标签内定义的变量,在整个模板页面中都是有效的(全局作用域)。
{php echo ...;} 或 {$var} 形式
这种方式主要用于输出单个变量或一个简单的 PHP 表达式的结果。
语法格式:
(图片来源网络,侵删)
<!-- 输出一个变量 -->
{php echo $my_variable;}
<!-- 更简洁的写法,使用模板引擎的变量输出功能 -->
{$my_variable}
<!-- 输出一个函数的返回值 -->
{php echo date('Y-m-d H:i:s');}
<!-- 或者使用更灵活的函数调用标签 -->
{function date('Y-m-d H:i:s')}
特点:
- 行内形式:适合在 HTML 属性或文本内容中快速输出一个值。
- 注意:
{$var} 实上是模板引擎的变量输出语法,它内部会调用 echo,而 {php echo ...;} 是直接执行 PHP 代码。
PHP 原生标签的常见应用场景
当你发现 PHPCMS 的系统标签(如 {loop}, {if})不够用时,就可以考虑使用 PHP 标签。
场景 1:定义变量并使用
{php
// 从 URL 获取一个 ID 参数
$id = $_GET['id'];
// 根据ID做一些处理
$title = "文章标题 #" . $id;
}
<h1>{$title}</h1>
场景 2:调用非模型类的静态方法或实例化类
这是最常见的需求,系统标签通常只能调用 model 目录下模型类的方法,如果你需要调用其他类(如数据库操作类、缓存类、工具类等),就必须用 PHP 标签。
示例:直接使用 pc_base::load_model() 加载模型并执行原生 SQL 查询
{php
// 1. 加载模型类
$model = pc_base::load_model('content_model'); // 假设你的表在 content 模型中
// 2. 执行原生 SQL 查询
$sql = "SELECT id, title, inputtime FROM v9_news WHERE status=1 ORDER BY id DESC LIMIT 5";
$data = $model->query($sql);
// 3. 将查询结果赋值给一个变量,以便在后面的 {loop} 中使用
// 注意:这里我们自定义了一个变量名 $my_custom_list
$my_custom_list = $data;
}
<!-- 3. 使用系统标签 loop 来遍历我们自定义的变量 -->
{loop $my_custom_list $r}
<li>
<a href="{$r['url']}">{$r['title']}</a>
<span>{date('Y-m-d', $r['inputtime'])}</span>
</li>
{/loop}
场景 3:复杂的条件判断
当 if 标签的逻辑过于复杂时,可以用 PHP 标签来处理。
{php
$user_level = 3; // 假设这是从数据库获取的用户等级
$is_vip = ($user_level > 2) ? true : false;
}
{if $is_vip}
<div class="vip-content">
这里是 VIP 专享内容。
</div>
{else}
<div class="normal-content">
请升级 VIP 以查看更多内容。
</div>
{/if}
场景 4:执行循环和数组操作
{php
$tags = array('php', 'html', 'css', 'javascript');
shuffle($tags); // 打乱数组顺序
}
<ul>
{loop $tags $tag}
<li>{$tag}</li>
{/loop}
</ul>
场景 5:包含外部 PHP 文件
如果你有一些可复用的 PHP 逻辑,写在了单独的文件里,可以在模板中引入。
假设你有一个文件 my_functions.php:
// my_functions.php
function get_greeting($name) {
return "你好, " . $name . "!";
}
在你的模板文件中:
{php
// 引入文件
include_once PHPCMS_PATH . 'my_functions.php';
// 调用函数
$greeting = get_greeting('访客');
}
<h2>{$greeting}</h2>
重要注意事项和最佳实践
-
安全第一:直接在模板中写 PHP 意味着将一部分控制权交给了模板文件。绝对不要让用户输入直接进入 {php} 标签执行,这会导致严重的安全漏洞(如代码注入),所有用户输入必须经过严格过滤和验证。
-
性能考虑:模板引擎的主要优势是缓存编译后的模板,大量的 PHP 逻辑写在模板中,可能会破坏缓存机制,或者导致模板文件臃肿,影响维护和加载性能。应遵循“胖模型,瘦控制器,瘦模板”的原则。
-
职责分离:
- 模型:负责数据操作和业务逻辑。
- 控制器:负责调用模型,获取数据,并将数据分配给模板。
- 模板:负责展示数据,只包含最简单的展示逻辑(如
if, loop)。
- PHP 标签:是“例外”或“补充”,当你发现控制器或模型无法方便地完成某个任务时,才在模板中使用它来“救急”。
-
变量作用域:在 {php} 标签内定义的变量,会直接成为模板的全局变量,要注意变量名不要与系统变量或循环变量冲突。
-
调试:在模板中调试 PHP 代码很麻烦,建议在开发时,可以将 error_reporting 设置为 E_ALL,并开启 PHP 的错误显示,这样能更快地定位问题。
标签类型
语法
主要用途
优点
缺点
系统标签
{loop}, {if}, {category}, {pc} 等
调用框架预设的数据和方法
安全、高效、易于维护
功能有限,无法处理复杂逻辑
PHP 标签
{php ... }, {php echo ...;}
执行原生 PHP 代码,实现复杂逻辑
功能强大,灵活
可能破坏 MVC 结构,有安全风险,不利于维护
核心建议:尽量使用 PHPCMS 的系统标签,当确实无法完成需求时,再使用 {php} 标签,并且只将最必要的、无法下放到控制器或模型的逻辑放在模板中,这能让你在功能强大和代码优雅之间找到最佳平衡点。
这是最常用、最推荐的方式,它可以在模板的任何位置嵌入一段或多段 PHP 代码。

语法格式:
{php
// 在这里写你的 PHP 代码
// 可以是多行
$my_variable = "Hello from PHP!";
echo $my_variable;
}
特点:
- 代码块形式:适用于执行一段或多行 PHP 逻辑,比如定义变量、进行复杂计算、调用非模型类的静态方法等。
- 作用域:在
{php}标签内定义的变量,在整个模板页面中都是有效的(全局作用域)。
{php echo ...;} 或 {$var} 形式
这种方式主要用于输出单个变量或一个简单的 PHP 表达式的结果。
语法格式:

<!-- 输出一个变量 -->
{php echo $my_variable;}
<!-- 更简洁的写法,使用模板引擎的变量输出功能 -->
{$my_variable}
<!-- 输出一个函数的返回值 -->
{php echo date('Y-m-d H:i:s');}
<!-- 或者使用更灵活的函数调用标签 -->
{function date('Y-m-d H:i:s')}
特点:
- 行内形式:适合在 HTML 属性或文本内容中快速输出一个值。
- 注意:
{$var}实上是模板引擎的变量输出语法,它内部会调用echo,而{php echo ...;}是直接执行 PHP 代码。
PHP 原生标签的常见应用场景
当你发现 PHPCMS 的系统标签(如 {loop}, {if})不够用时,就可以考虑使用 PHP 标签。
场景 1:定义变量并使用
{php
// 从 URL 获取一个 ID 参数
$id = $_GET['id'];
// 根据ID做一些处理
$title = "文章标题 #" . $id;
}
<h1>{$title}</h1>
场景 2:调用非模型类的静态方法或实例化类
这是最常见的需求,系统标签通常只能调用 model 目录下模型类的方法,如果你需要调用其他类(如数据库操作类、缓存类、工具类等),就必须用 PHP 标签。
示例:直接使用 pc_base::load_model() 加载模型并执行原生 SQL 查询
{php
// 1. 加载模型类
$model = pc_base::load_model('content_model'); // 假设你的表在 content 模型中
// 2. 执行原生 SQL 查询
$sql = "SELECT id, title, inputtime FROM v9_news WHERE status=1 ORDER BY id DESC LIMIT 5";
$data = $model->query($sql);
// 3. 将查询结果赋值给一个变量,以便在后面的 {loop} 中使用
// 注意:这里我们自定义了一个变量名 $my_custom_list
$my_custom_list = $data;
}
<!-- 3. 使用系统标签 loop 来遍历我们自定义的变量 -->
{loop $my_custom_list $r}
<li>
<a href="{$r['url']}">{$r['title']}</a>
<span>{date('Y-m-d', $r['inputtime'])}</span>
</li>
{/loop}
场景 3:复杂的条件判断
当 if 标签的逻辑过于复杂时,可以用 PHP 标签来处理。
{php
$user_level = 3; // 假设这是从数据库获取的用户等级
$is_vip = ($user_level > 2) ? true : false;
}
{if $is_vip}
<div class="vip-content">
这里是 VIP 专享内容。
</div>
{else}
<div class="normal-content">
请升级 VIP 以查看更多内容。
</div>
{/if}
场景 4:执行循环和数组操作
{php
$tags = array('php', 'html', 'css', 'javascript');
shuffle($tags); // 打乱数组顺序
}
<ul>
{loop $tags $tag}
<li>{$tag}</li>
{/loop}
</ul>
场景 5:包含外部 PHP 文件
如果你有一些可复用的 PHP 逻辑,写在了单独的文件里,可以在模板中引入。
假设你有一个文件 my_functions.php:
// my_functions.php
function get_greeting($name) {
return "你好, " . $name . "!";
}
在你的模板文件中:
{php
// 引入文件
include_once PHPCMS_PATH . 'my_functions.php';
// 调用函数
$greeting = get_greeting('访客');
}
<h2>{$greeting}</h2>
重要注意事项和最佳实践
-
安全第一:直接在模板中写 PHP 意味着将一部分控制权交给了模板文件。绝对不要让用户输入直接进入
{php}标签执行,这会导致严重的安全漏洞(如代码注入),所有用户输入必须经过严格过滤和验证。 -
性能考虑:模板引擎的主要优势是缓存编译后的模板,大量的 PHP 逻辑写在模板中,可能会破坏缓存机制,或者导致模板文件臃肿,影响维护和加载性能。应遵循“胖模型,瘦控制器,瘦模板”的原则。
-
职责分离:
- 模型:负责数据操作和业务逻辑。
- 控制器:负责调用模型,获取数据,并将数据分配给模板。
- 模板:负责展示数据,只包含最简单的展示逻辑(如
if,loop)。 - PHP 标签:是“例外”或“补充”,当你发现控制器或模型无法方便地完成某个任务时,才在模板中使用它来“救急”。
-
变量作用域:在
{php}标签内定义的变量,会直接成为模板的全局变量,要注意变量名不要与系统变量或循环变量冲突。 -
调试:在模板中调试 PHP 代码很麻烦,建议在开发时,可以将
error_reporting设置为E_ALL,并开启 PHP 的错误显示,这样能更快地定位问题。
| 标签类型 | 语法 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|---|
| 系统标签 | {loop}, {if}, {category}, {pc} 等 |
调用框架预设的数据和方法 | 安全、高效、易于维护 | 功能有限,无法处理复杂逻辑 |
| PHP 标签 | {php ... }, {php echo ...;} |
执行原生 PHP 代码,实现复杂逻辑 | 功能强大,灵活 | 可能破坏 MVC 结构,有安全风险,不利于维护 |
核心建议:尽量使用 PHPCMS 的系统标签,当确实无法完成需求时,再使用 {php} 标签,并且只将最必要的、无法下放到控制器或模型的逻辑放在模板中,这能让你在功能强大和代码优雅之间找到最佳平衡点。
