唐山网站建设

设为主页 加入收藏 繁體中文

如何正确理解PHP程序毛病信息的表示含义

核心提示:简述:我们编写程序时,不管怎样谨慎谨慎,出错总是在所难免的。这些毛病通常会迷惑PHP编译器。假设开发职员没法了解编译器报错信息的含义,那末这些毛病信息不但毫无用处,还会常常让人感到懊丧....

简述:我们编写程序时,不管怎样谨慎谨慎,出错总是在所难免的。这些毛病通常会迷惑PHP编译器。假设开发职员没法了解编译器报错信息的含义,那末这些毛病信息不但毫无用处,还会常常让人感到懊丧。

我们编写程序时,不管怎样谨慎谨慎,出错总是在所难免的。这些毛病通常会迷惑PHP编译器。假设开发职员没法了解编译器报错信息的含义,那末这些毛病信息不但毫无用处,还会常常让人感到懊丧。

编译PHP脚本时,PHP编译器会尽其所能报告它碰到的第1个题目。这样就产生1个题目:只有当毛病出现时,PHP才能将它辨认出来(本文后面对此题目进行了具体描写)。正是由于这个原因,编译器指出出错的那行,从表面上看来可能语法正确无误,或多是根本就不存在的1行!

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

本文中所讲述的内容与您所利用的PHP的版本无关,由于本文所描写的各种毛病其实不限定于某1特殊版本的特定毛病。另外我们假定您是1位低级或中级程序员,并已从事编程工作有半年或1年的时间。编译器的工作方式

要弄清楚编译器为甚么会报告某1行上存在毛病,首先必须明确编译器解析PHP代码的机制。我其实不打算在本文中对此进行具体论述,但是,我们将会讨论1些更容易于引发毛病的简单概念。

变量声明

假设在1条语句中声明1个变量,具体方式以下所示:

$variable = 'value';
 

编译器首先求出语句右半部份的值(即等号右侧的所有内容)。在1些编程书籍中,将此表示为语句的 RHS (右半部份)。恰恰正是语句的这1部份常常会引发毛病。假设使用的语法不正确,就会出现解析毛病。

解析毛病

Parse error:解析毛病,unexpected T_WHILE in c:\program files\apache group\apache\htdocs\script.php on line 19

每次肯定了前1毛病时,解析毛病1个接1个地不断出现。由于PHP在第1个解析毛病以后就停止履行脚本,调试并纠正这1系列的毛病常常会让人觉得特别厌烦。

而且,解析毛病具有很少的信息,几近不报告毛病所在的行号。具体缘由就是当出现毛病时,编译器判定好几行的语法看起来应当是有效的,直至碰到无效的语法,最可能的情形就是表达式中使用了预定义的字词,例如;

while = 10; // Bad ? while 就是1个预定义字词,不能分配给1个值

预定义的字词包括 while、function等,假设PHP使用 uses to evaluate your code. 您不能使用这些预定义字词来命名变量,而且假设您非要这样做的话,PHP就会报出更多的毛病,这是您没法忍耐。

关于这个题目,下面的示例可能会对您有所帮助。请咨询浏览1下下面所示的PHP 代码:

$b = "somevalue" if($b == "somevalue"){ print "Hello world!"; } ?>
 
毛病位于"$b ="1行(在语句的末端缺少分号),所以毛病应当是"解析毛病:第3行缺少分号"对吧?而不应当根据解析器判定的:

Parse error: parse error, unexpected T_IF in c:\program files\apachegroup\apache\htdocs\ereg2.php on line 4
 
在第4行,if() 语句的语法是正确的。那末,编译器是被甚么给弄胡涂了呢?线索就是"unexpected T_IF" 部份。出现 "unexpected T_???"毛病时,它所表示的含义为:编译器发现在预定义字不应当出现的位置出现。T_IF 代表 if(), T_WHILE 代表 while(), T_FOR 代表 for()等。

值得庆幸的是,1些毛病的缘由也很简单:

语句没有使用分号(;)结束,比如上面的示例。字符串中缺少引号。

其他1些常见的毛病

我见过的最多见的毛病就是,当没有使用大括号( } )结束1个函数或1个循环时出现的毛病,这很多是最多见,最让人烦的毛病。具体代码以下:

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编译器不断查找表示结束的大括号直至到达文件末尾为止。由于编译器未找到1个匹配的大括号,就会报告文件末尾处有毛病。
  假设正确地反应了代码的层次结构,毛病信息就会变得非常明显。假设没有标明朝码的层次结构,那末最后要想查清楚到底忘记了甚么也会变得几近是不可能的。所以,请记住,1定要标明朝码的层次结构。Tab键可以很轻易地实现这1点。对后续的开发职员来讲,掌控代码框架并对其进行修改也会更轻易1些。

MySQL 毛病

另1极其使人讨厌的毛病信息就是最多见的MySQL毛病,这常常使 PHP新手感到很是头疼:

Warning: Supplied argument is not a valid MySQL result resource in...
 
上面所报告有错的1行多是:

while($row = mysql_fetch_array($result)) {
 
参数 $result其实不是1个有效的资源。在英语中它表示由于查询失败,将没法处理mysql_fetch_array。任1查询的语法无效(您应当将查询复制-粘贴到MySQL 控制台参考来进行测试),或与数据库的连接失败(这类情况下您应当再次检查用户名和口令等)。

避免毛病产生

第1步,智能代码器可采取以下几步来消除以下毛病出现:

· 在每1条语句的末尾处,没必要考虑添加分号——这应当作为1种习惯。

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

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

结论

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

唐山网站建设www.fw8.net


TAG:信息,毛病,语句,编译器,分号
评论加载中...
内容:
评论者: 验证码: