变量访问语法 Variable Access

变量访问语法 Variable Access

DouView 的变量访问统一走「数组语义」:点号 . 取键、方括号 [] 取下标。引擎在编译期把这些写法 lowering 成对 $ctx->vars[...] 的数组访问。

一、属性 / 下标访问对照

写法 含义
{$user.name} 等价 $user['name'](点号取键)
{$user.$field} 动态键名,等价 $user[$field](键名本身是另一个变量)
{$arr[0]} 数字下标
{$arr[$i]} 变量下标
{$arr[$i.j]} 变量路径下标(下标内部还可继续点取,编译为表达式)

多级嵌套可连续点取:

{$order.user.address.city}
{$config.$env.db_host}
{$matrix[$row.$col]}

二、动态键

当键名来自另一个变量时,在键名前加 $:

{* 假设 $field = 'email',等价于输出 $user['email'] *}
{$user.$field}

这在「按字段名循环渲染列」等场景很有用。

三、禁止对象成员访问 ->

模板中不允许用 -> 访问对象成员或调用对象方法,编译期会直接报错。原因是引擎把模板变量统一按数组处理,不承接任意对象图,这既是安全约束(杜绝在模板里调用任意方法),也是可缓存/可预测的前提。

正确做法:在控制器 / 服务层把对象转成数组后再 assign 注入模板。

{* 错误:编译期报错 *}
{$user->name}
{$order->items->count()}

{* 正确:控制器侧转数组后注入 *}
{$user.name}
{$order.item_count}

唯一例外是内建命名空间变量 $douview.* / $smarty.*,它们由 BuiltinVarResolver 在编译期 lowering,不属于对象成员访问,详见「系统变量 Douview」篇。

四、循环变量的 @属性

在 {foreach} / {list} / {category} 的 item 变量后,可用 @ 前缀访问循环元数据(@iteration / @index / @total / @first / @last / @show):

{foreach from=$articles item=article}
    {$article@iteration}. {$article.title}
{/foreach}

这是访问语法的一个特例,完整说明见「循环属性 Loop Properties」篇。

添加日期: