PHP程序编译中常见谬误信息及解释
摘要:PHP程序编译中常见谬误信息及解释
PHP程序编译中常见谬误信息及解释
编写程序时,无论怎么小心审慎,犯错总是在灾难逃的。这些谬误通常会迷惑PHP编译器。假设开发人员无奈了解编译器报错信息的含义,那么这些谬误信息不只毫无用处,还会经常让人感到丧气。
编译PHP脚本时,PHP编译器会尽其所能报告它遇到的第一个成绩。这样就产生一个成绩:只要当谬误出现时,PHP能力将它辨认进去(本文前面对此成绩停止了具体形容)。正是因为这个缘故,编译器指出出错的那行,从外表上看来能够语法正确无误,或许能够是基本就不存在的一行!
更好天文解谬误信息可能大小节俭确定并改正谬误内容所花费的工夫。因此,在本文中,我将致力说明多种不同类型的PHP报错信息,以及在开发过程中如何正确理解各种报错信息的含义。
本文中所讲述的内容与您所运用的PHP的版本有关,由于本文所形容的各种谬误并不限定于某一特殊版本的特定谬误。另外咱们假如您是一位初级或许中级程序员,并已经从事编程工作有半年或一年的工夫。
编译器的工作模式
要搞清楚编译器为什么会报告某一行上存在谬误,首先必须明白编译器解析PHP代码的机制。我并不打算在本文中对此停止具体阐述,然而,咱们将会探讨一些更易于引发谬误的简略概念。
变量申明
假设在一条语句中申明一个变量,详细模式如下所示:
$variable = 'value';
编译器首先求出语句右半局部的值(即等号右边的一切内容)。在一些编程书籍中,将此示意为语句的 RHS (右半局部)。恰好正是语句的这一局部经常会引发谬误。假设利用的语法不正确,就会出现解析谬误。
解析谬误
Parse error:解析谬误,unexpected T_WHILE in c://program files//apache group//apache//htdocs//script.php on line 19
每次确定了前一谬误时,解析谬误一个接一个地始终出现。由于PHP在第一个解析谬误之后就中止执行脚本,调试并纠正这一系列的谬误往往会让人觉得顺便厌烦。
而且,解析谬误具备很少的信息,几乎不报告谬误所在的行号。详细缘由就是当出现谬误时,编译器断定好几行的语法看起来应该是有效的,直至遇到无效的语法,最能够的情景就是表达式中利用了预约义的字词,例如;
while = 10; // Bad ? while 就是一个预约义字词,不能分配给一个值
预约义的字词包括 while、function等,假设PHP利用 uses to evaluate your code. 您不能利用这些预约义字词来命名变量,而且假设您非要这样做的话,PHP就会报出更多的谬误,这是您无奈忍受。
关于这个成绩,下面的示例能够会对您有所协助。请咨询浏览一下下面所示的PHP 代码:
$b = somevalue
if($b == somevalue){
print Hello world!;
}
?>
谬误位于$b =一行(在语句的末端短少分号),所以谬误应该是解析谬误:第3行短少分号对吧?而不应该根据解析器断定的:
Parse error: parse error, unexpected T_IF in c://program files//apache
group//apache//htdocs//ereg2.php on line 4
在第4行,if() 语句的语法是正确的。那么,编译器是被什么给搞懵懂了呢?线索就是unexpected T_IF 局部。出现 unexpected T_???谬误时,它所示意的含义为:编译器发如今预约义字不应该出现的地位出现。T_IF 代表 if(), T_WHILE 代表 while(), T_FOR 代表 for()等。
值得庆幸的是,一些谬误的缘由也很简略:
语句没有利用分号(;)完结,比如上面的示例。字符串中短少引号。
其余一些常见的谬误
我见过的最常见的谬误就是,当没有利用大括号( } )完结一个函数或许一个循环时出现的谬误,这很能够是最常见,最让人烦的谬误。
详细代码如下:
function UselessFunction() {
for($i < 0; $i < 10; $i++){
}
将产生下列谬误:
Parse error: parse error, unexpected $ in c://program files//apache
group//apache//htdocs//ereg2.php on line 9
因为函数 UselessFunction 没有利用大括号( } )来完结,PHP编译器始终查找示意完结的大括号直至到达文件开端为止。由于编译器未找到一个婚配的大括号,就会报告文件开端处有谬误。
假设正确地反映了代码的层次构造,谬误信息就会变得十分显著。假设没有标明代码的层次构造,那么最后要想查清楚到底遗记了什么也会变得几乎是不能够的。所以,请记住,肯定要标明代码的层次构造。Tab键可能很容易地完成这一点。对后续的开发人员来说,把握代码框架并对其停止修正也会更容易一些。
MySQL 谬误
另一极端令人讨厌的谬误信息就是最常见的MySQL谬误,这经常使 PHP新手感到颇为头疼: Warning: Supplied argument is not a valid MySQL result resource in...
上面所报告有错的一行能够是:
while($row = mysql_fetch_array($result)) {
参数 $result并不是一个有效的资源。在英语中它示意由于查询失败,将无奈解决mysql_fetch_array。任一查询的语法无效(您应该将查询复制-粘贴到MySQL 控制台参考来停止测试),或许与数据库的衔接失败(这种情况下您应该再次反省用户名和口令等)。
防止谬误发生
第一步,智能代码器可采取以下几步来消弭下列谬误出现:
· 在每一条语句的开端处,不必思考减少分号——这应该成为一种习气。
· 总是要尽能够标明代码的层次构造,这可能使您可以查看能否遗记在if 调用或函数末端等地位减少大括号。
· 请利用可突出显示语法的编辑器(如 HTML-Kit)。有了这类编辑器的辅助,您就能确定能否遗记了减少引号,能否短少分号等。
编译PHP脚本时,PHP编译器会尽其所能报告它遇到的第一个成绩。这样就产生一个成绩:只要当谬误出现时,PHP能力将它辨认进去(本文前面对此成绩停止了具体形容)。正是因为这个缘故,编译器指出出错的那行,从外表上看来能够语法正确无误,或许能够是基本就不存在的一行!
更好天文解谬误信息可能大小节俭确定并改正谬误内容所花费的工夫。因此,在本文中,我将致力说明多种不同类型的PHP报错信息,以及在开发过程中如何正确理解各种报错信息的含义。
本文中所讲述的内容与您所运用的PHP的版本有关,由于本文所形容的各种谬误并不限定于某一特殊版本的特定谬误。另外咱们假如您是一位初级或许中级程序员,并已经从事编程工作有半年或一年的工夫。
编译器的工作模式
要搞清楚编译器为什么会报告某一行上存在谬误,首先必须明白编译器解析PHP代码的机制。我并不打算在本文中对此停止具体阐述,然而,咱们将会探讨一些更易于引发谬误的简略概念。
变量申明
假设在一条语句中申明一个变量,详细模式如下所示:
$variable = 'value';
编译器首先求出语句右半局部的值(即等号右边的一切内容)。在一些编程书籍中,将此示意为语句的 RHS (右半局部)。恰好正是语句的这一局部经常会引发谬误。假设利用的语法不正确,就会出现解析谬误。
解析谬误
Parse error:解析谬误,unexpected T_WHILE in c://program files//apache group//apache//htdocs//script.php on line 19
每次确定了前一谬误时,解析谬误一个接一个地始终出现。由于PHP在第一个解析谬误之后就中止执行脚本,调试并纠正这一系列的谬误往往会让人觉得顺便厌烦。
而且,解析谬误具备很少的信息,几乎不报告谬误所在的行号。详细缘由就是当出现谬误时,编译器断定好几行的语法看起来应该是有效的,直至遇到无效的语法,最能够的情景就是表达式中利用了预约义的字词,例如;
while = 10; // Bad ? while 就是一个预约义字词,不能分配给一个值
预约义的字词包括 while、function等,假设PHP利用 uses to evaluate your code. 您不能利用这些预约义字词来命名变量,而且假设您非要这样做的话,PHP就会报出更多的谬误,这是您无奈忍受。
关于这个成绩,下面的示例能够会对您有所协助。请咨询浏览一下下面所示的PHP 代码:
$b = somevalue
if($b == somevalue){
print Hello world!;
}
?>
谬误位于$b =一行(在语句的末端短少分号),所以谬误应该是解析谬误:第3行短少分号对吧?而不应该根据解析器断定的:
Parse error: parse error, unexpected T_IF in c://program files//apache
group//apache//htdocs//ereg2.php on line 4
在第4行,if() 语句的语法是正确的。那么,编译器是被什么给搞懵懂了呢?线索就是unexpected T_IF 局部。出现 unexpected T_???谬误时,它所示意的含义为:编译器发如今预约义字不应该出现的地位出现。T_IF 代表 if(), T_WHILE 代表 while(), T_FOR 代表 for()等。
值得庆幸的是,一些谬误的缘由也很简略:
语句没有利用分号(;)完结,比如上面的示例。字符串中短少引号。
其余一些常见的谬误
我见过的最常见的谬误就是,当没有利用大括号( } )完结一个函数或许一个循环时出现的谬误,这很能够是最常见,最让人烦的谬误。
详细代码如下:
function UselessFunction() {
for($i < 0; $i < 10; $i++){
}
将产生下列谬误:
Parse error: parse error, unexpected $ in c://program files//apache
group//apache//htdocs//ereg2.php on line 9
因为函数 UselessFunction 没有利用大括号( } )来完结,PHP编译器始终查找示意完结的大括号直至到达文件开端为止。由于编译器未找到一个婚配的大括号,就会报告文件开端处有谬误。
假设正确地反映了代码的层次构造,谬误信息就会变得十分显著。假设没有标明代码的层次构造,那么最后要想查清楚到底遗记了什么也会变得几乎是不能够的。所以,请记住,肯定要标明代码的层次构造。Tab键可能很容易地完成这一点。对后续的开发人员来说,把握代码框架并对其停止修正也会更容易一些。
MySQL 谬误
另一极端令人讨厌的谬误信息就是最常见的MySQL谬误,这经常使 PHP新手感到颇为头疼: Warning: Supplied argument is not a valid MySQL result resource in...
上面所报告有错的一行能够是:
while($row = mysql_fetch_array($result)) {
参数 $result并不是一个有效的资源。在英语中它示意由于查询失败,将无奈解决mysql_fetch_array。任一查询的语法无效(您应该将查询复制-粘贴到MySQL 控制台参考来停止测试),或许与数据库的衔接失败(这种情况下您应该再次反省用户名和口令等)。
防止谬误发生
第一步,智能代码器可采取以下几步来消弭下列谬误出现:
· 在每一条语句的开端处,不必思考减少分号——这应该成为一种习气。
· 总是要尽能够标明代码的层次构造,这可能使您可以查看能否遗记在if 调用或函数末端等地位减少大括号。
· 请利用可突出显示语法的编辑器(如 HTML-Kit)。有了这类编辑器的辅助,您就能确定能否遗记了减少引号,能否短少分号等。