注意:这里坑不全是PHP做错了,是初学者应该注意的地方。
-
switch
/in_array
等的松比较<?php $a = 0; switch($a){ case 'a': echo 'a'; case 'b': echo 'b'; } $arr = ['c','d']; echo in_array($a,$arr) ? 'Yes' : 'No';
解决:对于
switch
做类型转换;in_array
传入第三个参数true
。 -
运算符优先级的例外
if ($a = 100 && $b = 200) { var_dump($a, $b); }
&&
优先级大于=
,所以按照法则是$a = (100 && $b) = 200
,当然这不是你想要的,而实际执行起来也不是法则想要的。$x = true and false; var_dump($x); $x = true && false; var_dump($x);
&&
>=
>and
,所以使用and
就是你想要的了。 -
关于
strtotime
$t = strtotime('2018-08-31'); echo date('Y-m-d',strtotime('-1 month',$t));//2017-07-31 echo '<br>'; echo date('Y-m-d',strtotime('-2 month',$t));//2017-07-01
实际上这也不算坑,因为6月没有31天。所以说这个事不能这么干。
-
foreach
传址引用$arr = [1,2,3]; foreach($arr as &$v){ } foreach($arr as $v){ echo $v; }
$v
是当前键值的拷贝,如果引用,更改$v
即更改数组。foreach不形成块作用域,第一个foreach结束后,$v
仍然存在指向$arr[2]
。第二次foreach时,首先把$arr[0]
赋值给了$arr[2]
变成[1,2,1]
,然后又把$arr[1]
赋值给$arr[2]
变成[1,2,2]
,最后把$arr[2]
赋值给自己,还是[1,2,2]
。办法一:不重复使用
$v
(同一变量名)。
办法二:使用后及时unset($v)
(推荐)。
办法三:第二个foreach也取址,便不会产生此问题。。 -
注意八进制
var_dump(0123 == 123); var_dump('0123' == 123);
-
精度丢失
echo floor((0.1 + 0.7) * 10); echo '<br>'; echo intval(0.58 * 100); echo '<br>'; var_dump((8 - 6.4) == 1.6);