正确理解PHP程序编译时的错误信息

网络整理 - 08-16

我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的。这些错误通常会迷惑PHP编译器。如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧。

编译PHP脚本时,PHP编译器会尽其所能报告它遇到的第一个问题。这样就产生一个问题:只有当错误出现时,PHP才能将它识别出来(本文后面对此问题进行了详细描述)。正是由于这个缘故,编译器指出出错的那行,从表面上看来可能语法正确无误,或者可能是根本就不存在的一行!

更好地理解错误信息可以大大节省确定并改正错误内容所花费的时间。因此,在本文中,我将努力阐明多种不同类型的PHP报错信息,以及在开发过程中如何正确理解各种报错信息的含义。

本文中所讲述的内容与您所应用的PHP的版本无关,因为本文所描述的各种错误并不限定于某一特殊版本的特定错误。另外我们假定您是一位初级或者中级程序员,并已经从事编程工作有半年或一年的时间。

编译器的工作方式

要搞清楚编译器为什么会报告某一行上存在错误,首先必须明确编译器解析PHP代码的机制。我并不打算在本文中对此进行详细论述,但是,我们将会讨论一些更易于引发错误的简单概念。

变量声明

如果在一条语句中声明一个变量,具体方式如下所示:

$variable='value';

编译器首先求出语句右半部分的值(即等号右边的所有内容)。在一些编程书籍中,将此表示为语句的RHS(右半部分)。恰恰正是语句的这一部分常常会引发错误。如果使用的语法不正确,就会出现解析错误。

解析错误

Parseerror:解析错误,unexpectedT_WHILEinc:\\programfiles\\apachegroup\\apache\\htdocs\\script.phpalign=centerbgColor=#e3e3e3border=1>while=10;//Bad?while就是一个预定义字词,不能分配给一个值
预定义的字词包括while、function等,如果PHP使用usestoevaluateyourcode.您不能使用这些预定义字词来命名变量,而且如果您非要这样做的话,PHP就会报出更多的错误,这是您无法忍受。

关于这个问题,下面的示例可能会对您有所帮助。请咨询阅读一下下面所示的PHP代码:

<?php
$b=somevalue
if($b==somevalue){
printHelloworld!;
}
?>
错误位于$b=一行(在语句的末端缺少分号),所以错误应该是解析错误:第3行缺少分号对吧?而不应该依据解析器判定的:

Parseerror:parseerror,unexpectedT_IFinc:\\programfiles\\apache
group\\apache\\htdocs\\ereg2.phpalign=centerbgColor=#e3e3e3border=1>functionUselessFunction(){
for($i<0;$i<10;$i++){
}
将产生下列错误:

Parseerror:parseerror,unexpected$inc:\\programfiles\\apache
group\\apache\\htdocs\\ereg2.phpalign=centerbgColor=#e3e3e3border=1>while($row=mysql_fetch_array($result)){
参数$result并不是一个有效的资源。在英语中它表示因为查询失败,将无法处理mysql_fetch_array。任一查询的语法无效(您应该将查询复制-粘贴到MySQL控制台参考来进行测试),或者与数据库的连接失败(这种情况下您应该再次检查用户名和口令等)。

防止错误发生

第一步,智能代码器可采取以下几步来消除下列错误出现:

·在每一条语句的末尾处,不必考虑添加分号——这应该成为一种习惯。

·总是要尽可能标明代码的层次结构,这可以使您能够查看是否忘记在if调用或函数末端等位置添加大括号。

·请使用可突出显示语法的编辑器(如HTML-Kit)。有了这类编辑器的辅助,您就能确定是否忘记了添加引号,是否缺少分号等。

结论

本文我们对PHP编译器可报出的一些看起来可能没有什么意义的错误有了一定的了解。我们需要将所学的知识应用到如何避免错误以及错误出现时如何纠正错误。调试是一个开发人员所有工作中的最重要的部分之一。提高调试效率可大大加快整个工作的进度,缩短完成一项工程所需花费的时间,同时还可以明显减轻代码失败所带来的精神压力。