变量输出 Variable Output
变量输出是模板里最常用的语法,形态为 {$变量名}。它可以带属性访问、数组下标、修饰器链、nofilter 标志,也可以写成三元表达式。
一、基本语法
{$变量名}
示例:
{$title}
{$user.name}
{$arr[0]}
{$article.content nofilter}
{$price|string_format:"%.2f"}
引擎内部把「变量/对象/数字常量直接输出」归为 ECHO_ 节点,把「变量三元 {$a ? x : y}」归为 TERNARY 节点,均由 EchoTagCompiler 负责输出策略。
二、输出策略与全局自动转义
EchoTagCompiler 生成 echo 语句时,是否包裹 htmlspecialchars 由下面这个判定决定:
escapeHtml 为真 且 未带 nofilter 且 修饰器链里没有 HTML 转义类修饰器
→ 输出自动经 htmlspecialchars(..., ENT_QUOTES, 'UTF-8')
三个条件缺一不可:
| 条件 | 含义 |
|---|---|
escapeHtml |
引擎全局自动转义开关(DouView::setEscapeHtml(true)),默认关闭 |
nofilter |
该输出追加了裸词 nofilter,则强制不转义 |
| 已含转义修饰器 | 修饰器链里已有 |escape(或 |escape:"html")时不再重复转义,避免双重转义 |
DouPHP 前台默认 escapeHtml = false,此时 {$var} 原样输出;需要输出富文本 HTML 时,惯例写法是 {$xxx.content nofilter}(配合内容渲染器已产出的 HTML)。
三、修饰器链
变量后可用管道符 | 串接多个修饰器,参数用冒号 : 传递,字符串参数需加引号:
{$content|truncate:100|nl2br|strip_tags}
{$title|escape:"html"|default:"默认标题"}
{$create_time|date_format:"%Y-%m-%d %H:%M"}
修饰器从左到右依次作用,前一个的输出是后一个的输入。全部 20 个内置修饰器逐一详解见「变量修饰器 Modifiers」篇。
四、三元输出
变量三元用于「按条件二选一输出」,见「表达式运算 Expressions」篇:
{$user ? '已登录' : '游客'}
{$count > 0 ? $count : '空'}
三元输出同样受全局转义判定约束:escapeHtml 为真且未带 nofilter 时,最终结果会被 htmlspecialchars。
五、注意事项
- 变量名区分大小写,
{$Title}与{$title}是两个变量。 - 未赋值的变量输出为空(引擎在渲染期抑制了 notice/warning),需要占位文案时用
|default:"..."。 - 输出对象成员
->不被允许,请在控制器侧转成数组再注入(详见「变量访问语法 Variable Access」)。