php要小心的坑

本文主要介绍PHP开发中需小心的三个坑。一是弱类型,涉及按需转换概念、松散比较转换规则等,需牢记转换规则并警惕自动转换;二是浮点不精确,要了解原因并掌握解决办法;三是引用,包括foreach &问题和对象引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 类型比较表

怎么样达标
  1. 手册那几个表 背下来
  2. 转换规则,背下来
  3. 松散比较自动转换方向 背下来
  4. 能够准确识别和警惕会自动转换的地方

浮点不精确

这个相对简单,就是你要知道浮点计算会出问题,然后大概原因是什么?怎么解决?

浮点不精确

上代码

<?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浮点数的一个常见问题的解答

怎么破
  1. 先转换为int在计算
  2. 用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中,对象都是引用传值,

转载于:https://juejin.im/post/5c91e0b9e51d45646045ef4e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值