我们编写程序时,即使是经验丰富的程序员,犯个错误也是在所难免的。但是,如果开发人员不能注意到这些错误,也无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧。
更好地理解错误信息可以大大节省寻找并改正错误内容所花费的时间。因此在本文中,我们会介绍写PHP程序时常犯的错误,以及不同类型的PHP报错信息和含义。另外本文中所讲述的内容与所使用的PHP的版本无关。
要搞清楚编译器为什么会报告某一行上存在错误,首先必须明确编译器解析PHP代码的机制。
变量声明
如果在一条语句中声明一个变量,如下所示:
$var = 'value';
编译器首先会求出语句右半部分的值,恰恰正是语句的这一部分常常会引发错误。如果使用的语法不正确,就会出现解析错误。
解析错误
例如,Parse error:解析错误,unexpected T_WHILE in c:program filesapache groupapachehtdocsscript.php on line 19
每 次确定了前一错误时,解析错误一个接一个地不断出现,PHP在第一个解析错误之后就停止执行脚本。而且,解析错误具有很少的信息,几乎不报告错误所在的行 号。比如表达式中使用了预定义的关键字,例如:while = 10; while 就是一个预定义的关键字,不能分配给它一个值。 预定义关键字包括 while、function等,我们不能使用这些预定义关键字来命名变量,否则编译器就会报错。其中,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 filesapache groupapachehtdocsereg2.php on line 9
由于函数 UselessFunction 没有使用大括号( } )来结束,PHP编译器会不断查找表示结束的大括号直至到达文件末尾为止。因为编译器未找到一个匹配的大括号,就会报告文件末尾处有错误。
如果正确地反映了代码的层次结构,错误信息就会变得非常明显。否则,代码调试起来就会非常的困难。所以,一定要标明代码的层次结构,这对后续的开发人员来说,改进代码也会更容易一些。
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 控制台进行测试。
更多易犯的错误
1. 注意echo和print的区别
PHP 中echo和print都是输出的作用,但是两者之间还是有细微的差别。echo输出后没有返回值,但print有返回值,当其执行失败时返回 flase。因此可以作为一个普通函数来使用,例如执行$r = print "Hello World"; 变量$r的值将为1。而且代码中echo语句的运行效率要略快于print语句。
2. 注意空字符串('')和NULL的区别
PHP中空字符串和NULL都是以值为0存储的,但是他们的类型并不一样,前者是string,而后者是NULL,可见字符串('')、NULL值相等但类型不等。
3. 分清==(等与)和===(全等与)的区别
两者都属于比较运算符,==(等于)只比较值是否相等,而===(全等于)则不但比较值是否相等,还会比较类型是否相等,它更为严格。
4. 分清include与require的区别
include()与require()的功能也基本相同,但在用法上也有一些不同,include()是有条件包含函数,而require()则是无条件包含函数。例如在下面代码中,如果变量$a为真,则将包含文件a.php:
if($a){
include("a.php");
}
而require()则和include()不同,不管$a取何值,下面的代码都会把文件a.php包含:
if($a){
require("a.php");
}
在错误处理方面,使用include语句,如果发生包含错误,程序将跳过include语句,虽然会显示错误信息但是程序还是会继续执行。但是,requre语句会提示一个致命错误。
5. 注意isset和 empty的区别
empty是判断一个变量是否为“空”,而isset则是判断一个变量是否已经被设置。
6. 分清self :: 和 this--> 的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(常量)或者static(静态属性),那么就必须使用域操作符::,而如果被引用的变量或者方法没有被声明成const或者static,那么就使用指向操作符->。
相关推荐
例如,Parse error:解析错误,unexpected T_WHILE in c:program filesapache groupapachehtdocsscript.php on line 19每次确定了前一错误时,解析错误一个接一个地不断出现,PHP在第一个解析错误之后就停止执行脚本...
PHP开发者最常犯的11个MySQL错误编程小技巧共4页.pdf.zip
Psalm 用于查找PHP应用中错误的静态分析工具
基于PHP的食物营养数据分析项目介绍 基于已知的1284种食物进行营养数据分析 感谢 ThinkPHP、Bootstrap、ECharts、PHPExcel; 使用说明 基于bootstrap table搭建数据列表页面 查看各食物营养成分梯度分布 小工具...
php100-102PHP5.3 Xdebug 错误分析与性能调试 .rar
轻松学PHP之PHP的错误和异常处理,可以轻松学习PHP。PHP学习的宝典。PHP的错误和异常处理是非常重要的。
一种用语显示php出现错误的相关信息的方法.
php常用函数及解决常见错误,配置文件设置
电子书-php常见错误总结,谢谢指教,共同学习
PHP Error是为更好的解决开发过程中通常面临着标准的PHP错误信息一个开源的PHP库。它紧密集成到任何PHP环境(适用于所有的情况下,只有在开发环境中,只有在某些项目等),并与语法高亮显示错误。
ECSHOP3.6 H5网路错误解决方案(php.ini,httpd.conf,CorsService.php和304 Not Modified缓存错误)
php案例分析
路径不符合请自己修改,空格后面就是路径,以绝对路径"/"为主,如果你的404.html页面在跟目录,那么请修改为/404.html
$_FILES[file][error]会返回相应的错误代码: UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 UPLOAD_...
AI面相分析小程序是一款基于人工智能技术的面相分析应用,后端采用PHP代码和MySQL数据库开发。该小程序可以通过上传用户的面部照片,进行面相分析,分析用户的性格、健康、财运等方面的特征,为用户提供面相分析报告...
php实现的文法分析 代例子可供学习《编译原理》时做实验
主要介绍了PHP自定义错误处理的方法,结合实例形式分析了php错误处理机制及php自定义错误处理相关操作技巧,需要的朋友可以参考下
CentOS下编译php时的一些典型错误及解决办法.
php包含漏洞 挖掘 分析 工具 下载 可以自动分析源码是否有包含漏洞