变量访问语法 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」篇。