表达式运算 Expressions
DouView 在变量输出与 {assign} 的值位置支持一组受限但够用的表达式能力:顶层算术、变量三元、字符串插值。它刻意不是一门完整的表达式语言——没有函数调用、没有任意运算优先级组合,一切以「可编译、可预测、无副作用」为准。
一、算术运算
变量基串支持顶层算术运算符 + - * / %:
{$price * $count}
{$total + 1}
{$discount % 10}
{$a - $b}
这些是「顶层」运算:操作数是变量或数字常量,引擎按顺序 lowering 成 PHP 算术表达式。它不支持在输出位置写任意括号嵌套的复杂算式(复杂逻辑请放到 {if} 条件或控制器侧)。
二、三元表达式
形态 {$条件 ? 真分支 : 假分支},归为 TERNARY 节点:
{$user ? '已登录' : '游客'}
{$count > 0 ? $count : '空'}
{$status == 1 ? '启用' : '停用'}
规则要点:
- 条件部分:可以是一个变量(真值判断),或一个「变量 + 简单比较运算符 + 值」的比较式,支持的比较运算符为
== != <> >= <= > <; - 真 / 假分支:为值表达式(变量、字符串字面量、数字等);
- 三元输出同样受全局自动转义约束,需要输出 HTML 时追加
nofilter。
{* 条件为简单比较,分支为字符串 *}
{$article.is_top == 1 ? '【置顶】' : ''}
三、双引号字符串插值
双引号字符串中可直接嵌入变量,引擎自动展开为拼接:
{assign var="greeting" value="你好,$name"}
上例在运行期等价于把 "你好," . $name 的结果赋给 greeting。
四、反引号插值复杂变量
当插值目标是「带属性 / 下标的变量」时,直接写 $user.name 会有歧义,需用反引号把整个变量引用包起来:
{assign var="greeting" value="你好,`$user.name`"}
反引号内的 $user.name 会被当作一个完整变量引用求值,再拼进字符串。
五、单引号不插值
单引号字符串按字面处理,不做任何插值:
{assign var="raw" value='你好,$name'} {* 输出字面 你好,$name *}
需要变量拼接时用双引号;需要原样字面量(如含 $、{ 的文本)时用单引号。
六、边界与禁忌
- 输出位置与
{assign}值位置不支持函数调用(如{$arr|count}之外的count($arr)写法不被接受)。 {if}条件里另有更丰富的运算符(含逻辑词and/or/not、位运算),但同样禁止函数调用与变量函数调用,详见「条件判断 If」篇。- 复杂运算、字符串处理优先用修饰器链或放到控制器侧,模板保持「展示」职责。