那些年,被PHP坑过的代码

原创 2015年11月20日 11:01:22

作为世界上最好的语言,没有坑怎么能体现出新手与老鸟的区别呢?

PHP的==暗藏杀机

先看一个比较普及的代码:

$a = 0;
$b = 'a';

var_dump($a == $b);  // bool(true)

为什么两者是相等的呢????

因为PHP的==在比较前会尝试数据类型转换,如果有两边有数字,会转换成数字比较,于是数字字符串就被转换成了数字,而非数字字符串就会被转换成0,于是就相等了。

这种相等是非常危险的,在代码中非常难以发现。

再看一个例子:

$a = '111111111111111111111111111111110';
$b = '111111111111111111111111111111111';

var_dump($a == $b);

这个的比较结果是相等还是不相等呢?什么,这还要问等不等?明显不等啊。

但是,在php中,这个要看心情。。。

PHP5.3中,他们相等。PHP5.5中,他们不相等。

同样比较前,PHP会进行数据类型转换,把两者转换成整数,因为数字超过整数最大值,被截取,所以两者就一样了。

那PHP5.5为什么由作出了正确的判断呢?

再看对比:

$a = '111111111111111111111111111111110';
$b = '111111111111111111111111111111111';

var_dump($a == $b);  // php5.3 true  php5.5 false

$a = 111111111111111111111111111111110;
$b = 111111111111111111111111111111111;

var_dump($a == $b); // php5.3 true  php5.5 true

可以看到,PHP5.5中,对于这两个数字的比较,依然认为是相等的,但是对于字符串,则认为是不等的。所以可以推测:PHP5.5对于字符串数字比较做出了改进,如果转换成数字需要进行截取,则按照字符串比较。(求各位验证)

总结:能用===就不要用==

foreach中使用引用导致数据异常

代码如下:

$arr = array(1,2,3);
$arr2 = array('a','b','c');

foreach($arr as &$v){
}
foreach($arr2 as $v){
}

var_dump($arr);
var_dump($arr2);

最后的输出是多少呢?直觉上来看,两个循环对于数组都没有进行任何修改,两个数组应该没有任何变化才对。如果你这么想,那就太小看&的威力了。

真实的结果如下:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &string(1) "c"
}
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

我们惊讶的发现,第一个数组的最后一个元素被修改了。这是为什么?

首先要说明一下,PHP中循环变量在循环结束后会依然存在的:

var_dump($i);   // NULL
for ($i=0; $i < 3; $i++) { 
}
var_dump($i);   // int(3)

所以上面的例子中:

foreach($arr as &$v){
}
foreach($arr2 as $v){
}

第一个循环结束后,varr[2]的引用。这时对于varr[2],因为他俩是引用关系嘛。

于是,第二个循环中,foreach每次都向varr2的每个元素。最后第二个循环结束时,赋予varr[2],也就是'c'

所以,如果你在循环中用了引用,循环结束后,务必记得unset这个循环变量。

版权声明:本文为博主原创文章,未经博主允许不得转载。

那些年,在nodejs上踩过的坑

原文:http://cnodejs.org/topic/4fc7789a8be5d070121141cd ----------------------------------------------...
  • zengmingen
  • zengmingen
  • 2016年05月12日 18:32
  • 418

架构真经 | 那些年,我们踩过的缓存坑

在码农的世界里,一直以来都有一个信仰:只要应用使用了缓存,性能就会翻倍;用上缓存的应用就像是打通任督二脉的武林高手,内力生生不息。但是今天我想跟各位猿类朋友聊一聊自己在使用缓存时遇到的那些坑,这里主要...
  • qq_35246620
  • qq_35246620
  • 2017年05月05日 12:27
  • 1950

致Android-那些年,我们一起踩过的坑

大爷的,从搞android至今,踩过的坑倒是不少,MD,要是同一个坑,踩一次也就算了,踩两次、多次那就显得狠low了…记录那些年,希望跟我踩同一个坑的同胞们一些帮助(主要是怕自己踩同一个坑,哈哈~~)...
  • yiluyoufeng
  • yiluyoufeng
  • 2016年06月18日 23:29
  • 514

那些年,我们挖过的坑和遇到的坑(代码)

1.参数硬编码.   示例: public Paginate paginate(Integer page, Integer size, String xueli,String xuewei,Str...
  • javaMr_wwq
  • javaMr_wwq
  • 2015年03月30日 18:34
  • 290

转PHP开发时,一些常见的坑

1、null和空、0、false等四个值的比较 在PHP中,== 会先进行类型转换,再进行对比,而===会先比较类型,如果类型不同直接返回不相等,参考如下示例 $a = null; $b = ''; ...
  • youbl
  • youbl
  • 2014年11月11日 19:24
  • 4324

使用git遇到的坑

在github上面已经上传过不少代码了,虽然关注的人很少,我还是低调的做着这件事情。这个也见证了我学习之路。 但是对于使用git命令还是一知半解,这里只是总结我所遇到过的坑…. 1、git上传代码...
  • u011521890
  • u011521890
  • 2016年05月18日 16:17
  • 528

php 获取各种日期周月年季度的数据 代码

php date_default_timezone_set('PRC'); /** * 获取最近一周,一个月,一年 * */ function getLatelyTime($type = ''){...
  • wuzengman
  • wuzengman
  • 2018年01月02日 11:10
  • 44

php判断闰年的三种方法(闰年计算方法)

1,php闰年计算方法一: ①、普通年能被4整除而不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)  ②、世纪年能被400整除而不能被3200整除的为闰年。(如2000年是闰...
  • helin916012530
  • helin916012530
  • 2015年01月12日 15:42
  • 8133

java中遇到的坑

1.除0 代码:   Java代码   System.out.println(1.0d / 0);   System.out.println(0.0d / 0);   System.ou...
  • u011203602
  • u011203602
  • 2015年12月08日 14:26
  • 1566

坑爹的php代码

refine代码不仅仅是写代码,整体业务逻辑简化,结构上的简化能带来10倍的代码简化,能让client做的事情千万别让serve做。 譬如下面的代码,column实际上是category(分类)的含...
  • winlinvip
  • winlinvip
  • 2014年01月20日 19:02
  • 1159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:那些年,被PHP坑过的代码
举报原因:
原因补充:

(最多只允许输入30个字)