Z-Blog 主题模板里的 {$xxx} 与 {foreach}:编译后到底变成什么
摘要
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 里,配合浏览器检查器查看。
2026年10月20日 14:58
前后30天 · 点日期看归档
9月20日
9月21日
9月22日
9月23日
9月24日
9月25日
9月26日
9月27日
9月28日
9月29日
9月30日
10月1日
10月2日
10月3日
10月4日
10月5日
10月6日
10月7日
10月8日
10月9日
10月10日
10月11日
10月12日
10月13日
10月14日
10月15日
10月16日
10月17日
10月18日
10月19日
10月20日
10月21日
10月22日
10月23日
10月24日
10月25日
10月26日
10月27日
10月28日
10月29日
10月30日
10月31日
11月1日
11月2日
11月3日
11月4日
11月5日
11月6日
11月7日
11月8日
11月9日
11月10日
11月11日
11月12日
11月13日
11月14日
11月15日
11月16日
11月17日
11月18日
11月19日