表达式运算 Expressions

表达式运算 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」篇。
  • 复杂运算、字符串处理优先用修饰器链或放到控制器侧,模板保持「展示」职责。
添加日期: