PHP里的坑

注意:这里坑不全是PHP做错了,是初学者应该注意的地方。

  1. 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

  2. 运算符优先级的例外

    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就是你想要的了。

  3. 关于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天。所以说这个事不能这么干。

  4. 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也取址,便不会产生此问题。。

  5. 注意八进制

    var_dump(0123 == 123);
    var_dump('0123' == 123);
    
  6. 精度丢失

    echo floor((0.1 + 0.7) * 10);
    echo '<br>';
    echo intval(0.58 * 100);
    echo '<br>';
    var_dump((8 - 6.4) == 1.6);
    

猜你喜欢

转载自blog.csdn.net/z772532526/article/details/84147030