易犯的PHP小错误及相应分析

我们编写程序时,即使是经验丰富的程序员,犯个错误也是在所难免的。但是,如果开发人员不能注意到这些错误,也无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧。 更好地理解错误信息可以大大节省寻找并改正错误内容所花费的时间。因此在本文中,我们会介绍写PHP程序时常犯的错误,以及不同类型的PHP报错信息和含义。另外本文中所讲述的内容与所使用的PHP的版本无关。更多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,那么就使用指向操作符->。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-08-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏天天

onload事件

972
来自专栏闪电gogogo的专栏

Python初学——多进程Multiprocessing

1.1 什么是 Multiprocessing 多线程在同一时间只能处理一个任务。 可把任务平均分配给每个核,而每个核具有自己的运算空间。 1.2 添加进程 P...

2798
来自专栏程序员的SOD蜜

实例探究字符编码:unicode,utf-8,default,gb2312 的区别

 最近做邮件收发,不同的邮件系统间可能会出现编码问题,迫使我重新回来研究一下字符的编码问题,unicode,utf-8,gb2312这些编码格式都是我们熟知的,...

21710
来自专栏有趣的django

11.Flask钩子函数

     在Flask中钩子函数是使用特定的装饰器的函数。为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就...

833
来自专栏码字搬砖

JVM内存模型之运行时常量池

运行时常量池 jdk7之前属于方法区的一部分,jdk8之后属于Metaspace,在heap中。 运行时常量池俗称常量池,主要用于存放编译期生成的各种字...

971
来自专栏漫漫深度学习路

tensorflow错误总结

在写tensorflow代码的时候,经常会出现一些错误,在此记录一下,希望不要采同样的坑。 错误总结 bias = tf.get_variable("bias"...

1789
来自专栏ShaoYL

iOS 声明属性关键字讲解

34317
来自专栏py+selenium

python爬虫常用正则表达式组合匹配

正则表达式在线测试工具:http://tool.oschina.net/regex/?optionGlobl=global

1001
来自专栏java一日一条

Java虚拟机体系结构,你知道吗?

众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操...

751
来自专栏奔跑的蛙牛技术博客

什么是字节码?

字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位。

1903

扫码关注云+社区