php要小心的坑主要有
- 弱类型
- 浮点不精确
- 引用的理解
弱类型
php90%的坑都在弱类型,1是弱类型相关的转换规则,你得记住,2最麻烦的,在非常广泛的范围,都能进行类型按需转换,是你得识别出可能自动转换的地方,防止出bug,得时刻提防
主要有这么几点要掌握
- 什么时候转换?在程序需要的时候,会自动转换,这个就很难搞, 要时刻提防
- 转换成什么类型?
if('11' == 1.0)
比如这个松散比较背后的转换规则 ,你知道是吧str转换成float还是把float转换成str?这个需要知道 - 转换规则,知道从哪转到哪后,我们还要知道 数据 从类型A转换成类型B 产生的结果
- 另外就是php手册总结的,几个函数
isset empty is_null
的处理结果,和松散比较表
按需转换概念
在函数的参数 或者运算需要某个类型的变量时,如果给的不是,那就会自动转换,要是不能转,那就,报错
松散比较转换规则
看我总结的图
记住三条解决12个情况
- 凡是有一放是bool 就转换为bool
- 凡是有null,跟bool一样,只是要==false
- 凡是遇到array(str int float)全部false
剩下3个
- int+float 按float比
- str遇到int和float都转换成对方类型,转换规则是,如果是合法数值类型,就直接转数值,开头有数字就开头的数字,开头字母那就是0
互相转换规则
看我总结的图
用的比较多的情况是 其他往str和bool转,这俩尤其要搞清楚
手册附录
怎么样达标
- 手册那几个表 背下来
- 转换规则,背下来
- 松散比较自动转换方向 背下来
- 能够准确识别和警惕会自动转换的地方
浮点不精确
这个相对简单,就是你要知道浮点计算会出问题,然后大概原因是什么?怎么解决?
浮点不精确
上代码
<?php
echo floor((0.7+0.1)*10); //7
echo PHP_EOL;
echo intval(0.58*100); //57
echo PHP_EOL;
echo ((0.7+0.1)== 0.8)?'相等':'不相等';//不相等
echo PHP_EOL;
echo (1.23456789123456789==1.23456789123456780)?'相等':'不相等';//相等
echo PHP_EOL;
echo '---use bc-----';
echo (bcadd(0.7,0.1,1)== 0.8)?'相等':'不相等';//相等
复制代码
原因
因为数字在内部是二进制 具体看这个 PHP浮点数的一个常见问题的解答
怎么破
- 先转换为int在计算
- 用bc函数
引用
先看这个 我晚点补齐 php中引用&的真正理解-变量引用、函数引用、对象引用
foreach &问题
先看一个经典的题目
<?php
$arr = [1,2,3];
foreach($arr as &$v){
echo $v.',';
}
echo PHP_EOL;
foreach($arr as $v){
echo $v.',';
}
复制代码
结果输出
1,2,3,
1,2,2,
复制代码
为啥?这篇图文并茂解答PHP foreach引用&
obj引用
php中,对象都是引用传值,