当前位置:首页 > 日记 > 正文

如何正确理解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 代码:

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

相关文章

哪个优于iPad2和Android3浏览器的

哪个优于iPad2和Android3浏览器的

性能评价,浏览器,电脑软件,HTML5时代的到来让各大平板厂商的内置浏览器有了更大的发挥余地,无论是iOS的Safari还是Android 3.0的内置浏览器都号称完美支持HTML5的特性,不过他们的性能到底谁更强悍,以下是几张测试图表。结果显示,在Acid3测试上,…

WindowsXP中的18种秘密武器

WindowsXP中的18种秘密武器

秘密武器,电脑软件,WindowsXP,在WindowsXP的常用工具,如磁盘清洁等。它们的名字是什么它们在硬盘上藏在哪里这将挖掘作者,当我们使用这些工具时,不需要一步一步地找到一个地方去运行,点击开始,然后输入程序名OK。 磁盘清理大师- Cleanmgr 它用…

asp高级文章在线管理更新9

asp高级文章在线管理更新9

在线,高级,文章,电脑软件,asp,asp高级文章在线管理更新——经理登陆与验证 作者:海滩男孩 前面已经介绍了前台程序的管理系统,前台程序主要是提供给您的网页,文章浏览、文章搜索、转发的邮件发送程序,是介绍文章添加和保存实际上是系统后台程序…

Vista/Win7驱动程序完整性验证分析

Vista/Win7驱动程序完整性验证分析

驱动程序,完整性,蓝屏,验证,错误,以前的操作系统,该系统采用mmloadsystemimage加载驱动程序,它会调用mmchecksystemimage功能检查镜子的正确性。在以后的操作系统,mmchecksystemimage发生了有趣的变化。 原来MmCheckSystemImage(原系统),将使用s…

对奥巴马访问中国的七个主要问题主

对奥巴马访问中国的七个主要问题主

中国,巴马,电脑软件,本月,美国总统奥巴马将开始亚洲之行,自他上任以来,奥巴马的亚洲之行中最大的亮点就是他的访问在他上任的第一年到中国,到4天。这是亚洲四个国家中最长的停留时间。它也有望成为最丰富的部分双边议题和活动。当时,奥巴马将与…

微软IE10平台预览版首版正式发布

微软IE10平台预览版首版正式发布

平台,发布平台,预览版,正式发布,电脑软件,Dean Hachamovitch,微软IE部门的副院长、系主任提出的第一个平台预览版IE10浏览器在拉斯维加斯举行会议今天院长混合。 微软表示,它计划升级预览IE10每8到12周,用户可以登录到IE测试驱动网站下载试用…

WinXP超强超强3种技术的运用

WinXP超强超强3种技术的运用

技术,电脑软件,WinXP,如何允许IE以无效签名安装对象 现象 如果一个对象包含一个无效的签名,Internet Explorer将默认禁止它的安装。虽然这是XP SP2的增强安全设置,如果页面需要这个对象,就会出现错误。在默认设置下,即使管理员也不能通过Inte…

asp3高级编程(十二)

asp3高级编程(十二)

高级编程,电脑软件,十二,4.2.3服务器端包含指令的一个例子 本节提供了一些示例页面,可以用于各种服务器端报表实验。打开的页例子目录chapter04,显示SSI指令和ASP服务器对象的主页(即子目录chapter04 default.asp),如图4-3所示。 图4-3示例网页…

将流保存到数据库并修复新方法

将流保存到数据库并修复新方法

数据库,新方法,电脑软件,SQLServer中的图像类型的图像 然后,保存的数据通过showimg.aspx文件读取图片,就是要显示的图片,代码如下: 模糊的图像作为字节()= issuequestionrow.questionimage 转换为后备存储是内存流 昏暗的memstream新system.io.me…

番茄花园红磊重返盗版之路改造智能

番茄花园红磊重返盗版之路改造智能

智能机,番茄花园,之路,电脑软件,9月22日,一条微博发出后,网民们才知道番茄花园的作者洪磊已经出狱了,当年在网络世界风光无限的洪磊自己描述说正在找工作,他对未来发展的初步打算是转行避开盗版系统。出狱后的洪磊率先建设完毕“番茄花园”网站…

你的云资源可以赚钱!百度云商务城市

你的云资源可以赚钱!百度云商务城市

百度云,服务,赚钱,城市,电脑软件,{近日,百度推出了云可以说风险因素的高云商城,别误会。哦,这里不是Jingdong,淘宝商城,出售各种各样的商品线下实体,但销售各种网络资源,我们在各种各样的电影,百度的SkyDrive甚至音乐教材等。 打开云商城,可以看到…

理解Web页面工具语言XML六展望

理解Web页面工具语言XML六展望

语言,工具,页面,电脑软件,Web,六、XML展望   任何一项新技术的产生都是有其需求背景的,XML的诞生是在HTML遇到不可克服的困难之后。近年来HTML在许多复杂的Web应用中遇到了问题,要彻底解决这些问题,必须用功能强大的XML来替代HTML作为Web页…