26.1.3 逻辑错误

逻辑错误是最难发现和清除的错误类型。这类错误类型的代码是完全正确的,而且它也是按照正确的程序逻辑执行的,但是这种工作却不是编程人员所期望的。

逻辑错误可能出现于一个简单的键盘输入错误,例如:


for($i=0;$i<10;$i++);

{

echo'doing something<br/>';

}


以上这一小段代码是完全合法的。它遵循PHP语法。也不依赖任何外部服务,因此也不可能出现运行时错误。但是如果不仔细检查,它的运行结果可能就不是我们所期望的或程序员打算要的。

粗看起来,它好像是用for语句循环10次,每次执行都回显"doing something"。在第一行for语句结尾后的分号表示循环对下面的语句行没有任何影响。for语句将循环10次,没有任何输出,然后echo语句只执行一次。

因为这段代码完全合法,但是却效率低下,这样的代码将导致无法预见的结果,解析器也不会有任何警告或出错信息。计算机擅长做某些事情,但是它没有任何常识和智能。计算机只能做我们让它所做的事情。必须确认它所做的就是我们希望的。

逻辑错误不是由任何一种代码失败所导致的,而是程序员没有正确地编写代码以命令计算机做人们所期望的事情。结果,错误就不能自动检查到。计算机也不能告诉编程者出现了错误,更不会给他一段代码告诉他问题出在什么地方。逻辑错误只有通过适当的测试才能检测到。

如上所述的微小逻辑错误我们容易犯,也容易纠正,因为在首次运行源代码看到的输出结果并不是我们所期望的输出。但是,大多数逻辑错误的隐蔽性更强一些。

通常,麻烦的逻辑错误产生于开发人员的错误假设。在第25章“在大型项目中使用PHP和MySQL”中,我们已经建议请其他开发人员来审查代码并提出他们的测试方案,并请目标用户而不是开发人员作为测试人员进行测试。用户只输入某几种类型数据是很容易的,但是如果自己做测试容易漏掉一些没有检测到的情况。

举个例子,在某商务网站有一个Order Quantity文本框。开发人员是不是会假设用户只输入正数呢?如果一个用户输入-10,软件是否会将10倍于该物品价格的钱退还到用户信用卡里呢?

假设有一个文本输入框用来输入美元总数。它允许用户输入的总数后面带美元符号吗?允许满1000就用逗号分开吗?一些错误可以在客户端(例如,使用JavaScript)检查出来而无须由服务器来检查。

如果正在将信息传送到另一页面,可能有一些字符在一个URL中有特殊重要的意义,例如传输的字符串中包含空格。你遇到过这样的情况吗?

逻辑错误有许多。没有自动检测的方法。唯一的办法是,首先要消除暗含在脚本中的假设;其次是彻底地测试每种可能有效或无效的输入,确认这些输入都得到了期望结果。