Z-Blog 主题模板里的 {$xxx} 与 {foreach}:编译后到底变成什么

· zblog · 阅读 12
摘要

Z-Blog 的模板不是即时解释执行的,它先被编译成 PHP 文件缓存起来。理解编译结果,很多“为什么这样写不生效”就通了。{$title} 编译成什么模板里的 {$article.Title} 最终变成类似

Z-Blog 的模板不是即时解释执行的,它先被编译成 PHP 文件缓存起来。理解编译结果,很多“为什么这样写不生效”就通了。

{$title} 编译成什么

模板里的 {$article.Title} 最终变成类似 <?php echo $article->Title; ?>。所以点号取属性是可行的,但不能写函数调用,{$article->Title()} 这种语法不会被识别。

{foreach} 的坑

{foreach $articles as $article}
  <li>{$article.Title}</li>
{/foreach}

循环体内的 $article 是局部变量,循环外引用不到。想在循环外拿到“第一篇”的数据,要在循环里存到另一个变量。

{if} 里能写什么

能写比较、逻辑运算、常量判断:

{if $article.Status == 0 && $user.Level > 3}
  仅管理员可见
{/if}

不能写函数,也不能写数组下标链式访问太深的表达式,容易编译失败。

改完模板为什么要清缓存

编译产物在 zb_users/cache/compile/ 下。直接编辑模板文件后,如果同名编译文件的时间戳更新,Z-Blog 会复用旧缓存。所以改完务必重建模板,或者在后台点一次“清空缓存并重新编译”。

一个实用技巧

调试时想看某个变量里到底有什么,不要用 var_dump,模板里写 {$zbp->host} 这类是安全的,但输出复杂结构会把页面撑坏。可以临时写到一个隐藏 div 里,配合浏览器检查器查看。