PHP 编程陷阱

遍历数组元素,使用引用

foreach ($PostList as &$postInfo) { 
}
unset(&$postInfo); // 最好加上这条语句,不然下面的语句中用到这个变量,用的是数组最后一个元素

运算符结合性和优先级

尽可能不写运算符堆砌的语句,可读性较差。

浮点数比较

和其他语言浮点数比较相同

不同类型数值比较

var_dump("true == 70", true == 70);
bool(true)

整形和布尔比较,PHP会先把整形转换成布尔

php 版本 5.2.4 问题:文件字符串转码时按字节截断不当 比如

$str = “公司”;                               //默认以UTF-8编码
$str = Simple_Util_String::msubstr($str, 4); // 按字节截取前4个字节,原字符串有6个字节
$str .= “adfadsfasdfadsfasdf”;          //拼接后面的字符串  (执行下一步后,这些字符就消失了)
$str = iconv("UTF-8", "GBK//TRANSLIT",$str); // 转码 , 遇到不认识的字符串进行转写

执行此步时,“公司”的“司”字编码不完整,iconv不认识,但iconv没有转写,而是做了截断。导致$str后面的字符串也没有转换成功,“adfadsfasdfadsfasdf”丢失了。在一些商业产品,尤其是有关统计的系统里,这是很危险的。 解决方法是: 改变iconv第二个参数。

$str = iconv("UTF-8","GBK//IGNORE", $str);

总结:iconv的TRANSLIT并不靠谱,遇到不认识也不能转写的字符串,也可能截断。保险的方法是用IGNORE。

PHP 编程陷阱》上有2条评论

  1. foreach 还有一个指针问题,我这里踩过,foreach($arr as $v)这里的$arr循环内修改其值,如果在同进程下被使用指针时,php5.x内的会出现问题,这个官网上说过,“由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。”,php7却完美支持了,所以我只好使用了foreach($arr as & $v)已经reset($arr)来兼容。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax