《PHP编程》PHP中的这些坑,没踩过就算了说明了,但是一旦用到就踩坑了。例如,我列举了以下几项:1.由于使用了单引号和""作为分隔符,使用PHP函数explode来拆分字符串,无法正常拆分。原因:这里涉及到单引号和双引号的区别,单引号中的反斜杠无法解析。所以,在使用explode拆分的时候,如果使用单引号,会被当做一个字符串,而不是换行符,所以这时候,是无法正常拆分的。类似的问题还有字符串中的{}。在字符串中,必须在字符串中使用双引号才能成功解析用{}括起来的变量。2、由于BOM头,使用PHP函数json_decode解析json串,无法解析成功。原因:UTF-8编码的文件可以分为无BOM和BOM两种格式。什么是物料清单?“EFBBBF”这三个字节称为BOM,BOM的全称叫做“ByteOrderMard”。在utf-8文件中经常使用BOM来表示该文件是一个UTF-8文件,BOM的本意是在utf16中用来表示高低字节的顺序。字节流前有BOM,表示使用低字节序列(低字节在前),而utf8不需要考虑字节序列,所以实际上是没有BOM的。UTF-8以字节为编码单位,不存在字节顺序问题。UTF-16使用两个字节作为编码单元。在解释一个UTF-16文本之前,您必须首先弄清楚每个编码单元的字节顺序。比如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,这个是“Kui”还是“B”?如果保存文件时选择使用BOM,页面显示会出现异常。一般来说,php是不支持BOM的,php文件应该保存为UTF-8不带BOM类型,所以在保存UTF8编码的PHP文件时,不要使用BOM。3.由于正反斜杠,PHP函数basename的使用无效我们经常使用PHP函数basename从包含文件完整路径的字符串中获取基本文件名,但是由于正反斜杠的原因是那有时候你会发现basename函数不能生效,尤其是在window系统和linux系统之间切换的时候。原来basename函数是受操作系统影响的。在Windows中,斜杠(/)和反斜杠()都可以作为目录分隔符,但在其他环境下只能是斜杠(/)。因此,如果在window系统中使用反斜杠(),对其他系统来说就会有问题。为了避免这种影响,***都使用斜杠(/)作为目录分隔符。对于命名空间的使用,***首先使用str_replace函数将反斜杠()替换为斜杠(/)。4.trim系列函数太多无法去除trim函数的基本用法是去除最外层的空格、换行等。由于它的可选参数,很多人也会用它来去除UTF8BOM头、文件扩展名等,比如ltrim($str,"\xEF\xBB\xBF");rtrim($str,".txt");.但是很快,你会发现这些函数会去掉一些更多的东西。例如,您最初想删除后缀。结果,logtext.txt将变成logte而不是logtext。为什么?因为后一个参数的意思不是一个完整的字符串,而是一个字符列表,也就是说,它会一直检查最左边/最右边是否匹配这个列表中的一个。5、htmlspecialchars函数默认不转义单引号。很多网站将此函数作为通用输入过滤函数使用,但此函数默认不过滤单引号。这非常非常容易造成XSS漏洞。这种做法和不过滤双引号没什么区别,只要前端写得有点不规范(使用单引号),就会被坑。所以我们在使用的时候一定要给这个函数加上参数htmlspecialchars($data,ENT_QUOTES)。$someL将一直保留到函数/方法结束。而在使用引用的时候,foreach($someArras&$someL){}是通过引用保存的,也就是说,如果后面有同名的变量名,就会改变原来的数据(像误用的C指针).为了安全起见,建议在每次foreach(尤其是被引用的)之后使用unset来清除这些变量。7、小数(点数)不能直接比较是否相等。例如,if(0.5+0.2==0.7)的结果为假。原因是PHP是基于C语言的,而C语言由于是二进制的点数表示,无法准确表示大部分的点数。事实上,几乎所有的编程语言都不能准确表示小数(点数),这是一个普遍的现象,因为这是IEEE754的一个缺陷。如果要解决这个问题,只能另行建立标准。好像只有Mathematica解决了这个问题。8.字符串是否相同?建议使用===而不是==。为什么?因为这个比较是弱类型的。比较两者时,PHP会先尝试判断左边和右边是否是数字。问题是数字是什么样的字符串,是简单的数字串吗?远不止于此,它还包括以0x开头的十六进制记数法、XXeX类型的科学记数法等。例如'12e0'=='0x0C'为真。数值类型与字符串比较时,即使是一些以数字开头的非数值字符串,比如12=='12这个字符串',得到的值也会为真。所以在这些情况下,原本不相同的字符串可能会被判断为相等。使用===的比较是对包含类型的比较,不做任何转换,因此可以准确比较字符串是否相同。另外说一下JAVA,==不能比较字符串是否相等,因为字符串是一个对象,==就成了判断是否是同一个对象...9.不能用switch中的case作为if在PHP中使用在函数switch...case中,switch匹配case语句的值,case不能作为if使用。同时,switch表达式先匹配值类型相同的case语句,不一致的类型在后面处理,如下:10.strrchr函数是找一个字符,不是字符串。PHP手册中对strrchr()函数的解释是找到一个字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串末尾的所有字符。如果失败,则返回false否则。事实上,这个函数是在寻找一个字符,而不是一个字符串。下面这个例子,很多人一开始肯定以为是returnfalse,其实不然。上面的例子表明,如果$b是一个字符串,则只使用第一个字符,后面的其他字符将被忽略。
