核心要点
在 {dede:php} 标签中,你不能直接像写PHP文件那样写多行代码,它只能执行单行PHP代码。

(图片来源网络,侵删)
要执行多个PHP语句,你必须使用以下两种方法之一:
- 使用代码分隔符 :将多个语句用分号隔开,写在一行内。
- 使用代码块 :将多个语句用花括号 包裹起来,形成一个代码块。
下面我们通过具体的例子来解释这两种方法。
使用分号 () 隔开多个语句
这是最简单直接的方法,如果你有一系列简单的、不需要复杂逻辑的语句,可以将它们全部写在一行,并用分号隔开。
示例场景:定义两个变量,并分别输出它们的值。

(图片来源网络,侵删)
错误写法(直接换行,DedeCMS无法解析):
{dede:php}
$name = "张三";
$age = 25;
echo "姓名: " . $name;
echo "<br />";
echo "年龄: " . $age;
{/dede:php}
这种写法在DedeCMS中是无效的,它只会执行第一行 $name = "张三";,后续代码会被忽略或导致解析错误。
正确写法(使用分号):
{dede:php}
$name = "李四"; $age = 30; echo "姓名: " . $name; echo "<br />"; echo "年龄: " . $age;
{/dede:php}
输出结果:

(图片来源网络,侵删)
姓名: 李四
年龄: 30
优点:
- 简单、直观。
- 适用于少量、简单的连续操作。
缺点:
- 当语句较多或逻辑复杂时,代码会变得非常长,难以阅读和维护。
- 不适合包含
if/else、for、while等需要换行的控制结构。
使用代码块 包裹多个语句
这是最常用、最推荐的方法,尤其适用于处理复杂的逻辑,你可以将所有需要执行的代码(无论多少行)放在一对花括号 中。
示例场景:根据一个条件输出不同的内容。
正确写法(使用代码块):
{dede:php}
{
$is_vip = true; // 假设这是从数据库或其他地方获取的值
$user_name = "王五";
if ($is_vip) {
echo "<div style='color: gold;'>欢迎尊贵的VIP用户:{$user_name}!</div>";
} else {
echo "<div>欢迎普通用户:{$user_name}!</div>";
}
// 也可以调用函数
function sayHello($name) {
return "你好, " . $name . "!";
}
echo "<p>" . sayHello($user_name) . "</p>";
}
{/dede:php}
输出结果:
<div style='color: gold;'>欢迎尊贵的VIP用户:王五!</div>
<p>你好, 王五!</p>
优点:
- 可读性强:可以像写普通PHP文件一样,自由地换行和缩进,代码结构清晰。
- 功能强大:可以完整地使用PHP的所有语法结构,如
if/else、for、while、function等。 - 易于维护:逻辑块分明,方便后续修改和调试。
缺点:
- 相比单行写法,语法上多了一对花括号。
综合对比与最佳实践
| 特性 | 使用分号 () | 使用代码块 () |
|---|---|---|
| 适用场景 | 简单、连续的单行操作 | 复杂逻辑、条件判断、循环、函数定义等 |
| 代码可读性 | 差,代码挤在一行 | 好,支持换行和缩进 |
| 功能完整性 | 基础,无法使用多行结构 | 完整,支持所有PHP语法 |
| 推荐度 | ⭐⭐ (仅限极简单场景) | ⭐⭐⭐⭐⭐ (强烈推荐) |
实际应用案例
案例1:在列表页循环输出自定义字段
假设你在文章模型里添加了一个自定义字段 my_price,想在列表页循环输出它。
{dede:arclist titlelen='30' row='10'}
<li>
[field:title]
{dede:php}
{
// 获取当前文章的自定义字段值
// 注意:这里需要确保字段名和数据库中的字段名一致
$price = $fields['my_price'];
if (!empty($price)) {
echo " - 价格: ¥" . number_format($price, 2);
}
}
{/dede:php}
</li>
{/dede:arclist}
说明:
{dede:php}标签会在这个循环的每一次迭代中都执行一次。$fields是一个预定义的数组,包含了当前文章的所有字段信息,我们可以通过$fields['字段名']来获取自定义字段的值。
案例2:调用DedeCMS内置函数
{dede:php}
{
// 获取当前栏目ID
$typeid = $GLOBALS['typeid'];
// 使用DedeCMS内置函数获取栏目名称
$typename = GetSonTypeId($typeid); // 注意:这个函数可能不是你想要的,这里仅为示例
// 更正:获取栏目名称应该用 GetTopTypename() 或查询数据库
$typename = $GLOBALS['typename']; // 在栏目页,全局变量 $typename 已经存在
echo "当前栏目ID是: " . $typeid . "<br />";
echo "当前栏目名称是: " . $typename;
}
{/dede:php}
重要注意事项
- 性能与安全:
{dede:php}标签非常强大,但也带来了潜在的安全风险,如果模板可以被非管理员用户编辑,恶意用户可能通过它植入木马代码,请谨慎使用,并确保你的网站有良好的权限控制。 - 变量作用域:在
{dede:php}中定义的变量,其作用域通常仅限于该标签内部,但你可以通过global关键字或$GLOBALS数组来访问或修改全局变量(如上面的$GLOBALS['typeid'])。 - 开启支持:确保你的DedeCMS系统开启了PHP标签支持,默认情况下,DedeCMS是支持的,但如果你的网站被二次开发过,可能存在被禁用的风险,可以在后台的“系统” -> “系统基本参数” -> “核心设置”中查看相关选项。
要在 {dede:php} 标签中执行多个PHP语句,最佳实践是使用花括号 将代码块包裹起来,这能让你编写出结构清晰、易于维护且功能强大的PHP代码,充分发挥DedeCMS模板的灵活性,仅在代码非常简单且只有一两行时,才考虑使用分号隔开的单行写法。
