更新:鉴于这篇文章在google上有很高的排名,因此我觉得有必要在这里更正一下。本文中提到的问题源于PHP5.2.2的一个字符串bug,现在新版本PHP中该bug已经修正,可以正常运行龙卫国大大的模板引擎了。
前几天终于腾出时间在笔记本上装好了apache、php、mysql,都是现下载的最新版本。把以前的数据从以前的硬盘上转移过来之后,发现wakiblog运行起来是白屏。把error_reporting(0);注释掉之后,发现错误提示:
Parse error: syntax error, unexpected T_LNUMBER, expecting ']' in D:webzblogdata plcompileSimpleBlog_index.htmleacf7d3b.php on line 25
SimpleBlog_index.htmleacf7d3b.php是supertpl编译的模板文件,按理说除非模板里写错了,编译文件是不会出错的,而放假回家之后我一直忙着装NAS,压根就没动模板文件,怎么这就出错了呢……打开那个出错的文件之后吃了一惊:
$$tpl->all[''blog'']->num = 0 ;
$$tpl->all[''blog'']->key = NULL;
$$tpl->all[''blog'']->val = NULL;
$$tpl->all[''blog'']->first = true;
$$tpl->all[''blog'']->last = false;
$$tpl->all[''blog'']->notnull = true;
$$tpl->all[''blog'']_rownum = 1 ;
这种东西不必看就知道一定是错的,什么乱七八糟的变量符号和单引号。从虚拟主机上下载来了正常的编译文件一看,果然有问题。
$blog->num = 0 ;
$blog->key = NULL;
$blog->val = NULL;
$blog->first = true;
$blog->last = false;
$blog->notnull = true;
$blog_rownum = 1 ;
仔细想想,程序回家之后连碰都没碰过,自然不可能放着放着它自个就出错了。apache和php都装过多少次了,每次安装httpd.conf和php.ini该改哪些地方背都背下来了,也不像是会出错的地方,唯一剩下值得怀疑的地方就是兼容了。我在学校的时候PHP用的是5.2.0,这次下载的版本是5.2.3,换回5.2.0,删除错误的编译文件,重新编译果然没问题了。我不甘心,又下来了5.2.1和5.2.2两个版本,前者没有问题,后者出现同样的错误。到这里就能证实了,supertpl和php5.2.2及以后的版本都不兼容。
现WakiBlog中使用的supertpl是经过我自己精简的版本,除了留下核心解析部分一行没动以外,外围的功能都是我自己改的(被我删得只剩下102行了,里面还加了不少自己的代码),为了寻找问题根源,我在5.2.3环境下运行了一下supertpl包里面自带的演示程序,出错依旧。
supertpl是我很爱用的一个模板引擎,以前做Zarticle的时候,开始用的smarty,自从接触到supertpl之后,立刻被它的简洁、高效所吸引,因此更换了Zarticle的模板引擎。后来写的zDoc和WakiBlog也全都用了supertpl。Supertpl是PHP4时代的程序,这也是PHP发展到5.0之后很长一段时间我还在使用PHP4写东西的原因。后来转换到PHP5之后,supertpl依然工作良好,但这种局面到了5.2.2似乎也终于要结束了。