PHP松散比较的奇怪问题

  运行以下代码,可能会发现跟我们想象的有所差别,让我们一起研究下当PHP变量类型不一致时,变量比较为什么会产生这种奇葩结果。

    echo 'abc' == 0 ? '相等' : '不相等';//相等
    echo '1abc' == 1 ? '相等' : '不相等';//相等
    echo 'abc1' == 1 ? '相等' : '不相等';//不相等
    echo md5('240610708') == md5('QNKCDZO') ? '相等' : '不相等';//相等
    echo "0x1e240"=="123456" ?  '相等' : '不相等';//相等

PHP比较运算符

符号示例名称描述
==$a == $b等于类型转换为同一个类型后进行比较
===$a === $b全等先比较类型,类型相同在进行值比较
!= 或 <>$a != $b不等如果类型转换后,值不相等
!==$a !== $b不全等如果类型或者值不相等返回true
<=>$a <=> $b类型转换后,结合比较运算符如果a < b ,a == b,a > b ,分别输出-1 , 0 ,1
>$a > $b大于a大于b,输入true
>=$a >= $b大于等于a大于或等于b,输入true
<$a < $b小于a小于b,输入true
<=$a <= $b小于等于a小于或等于b,输入true

PHP变量类型自动转换规则

  使用像“==”、“!=”这样不需要区分类型的比较运算符进行比较时成为松散比较,PHP会先把符号两侧变量转为统一类型。

  这里对PHP松散比较符号“==“进行了梳理(T代表true F代码false)

TRUEFALSE10“1”“0”NULLarray()“”
TRUETFTFTFFFF
FALSEFTFTFTTTT
1TFTFTFFFF
0FTFTFTTFT
“1”TFTFTFFFF
“0”FTFTFTFFF
NULLFTFTFFTTT
array()FTFFFFTTF
“”FTFTFFTFT

  PHP是按照什么转换的呢?

  1. int和string比较:string自动转为int
  2. int和float比较:int自动转为float
  3. 任何类型和bool比较:都会自动转为bool
  4. 任何类型和非空数组比较:
  5. 任何类型和null、空array比较:除了自身和false外,其余均为fasle

  相信看到这里可以理解文章开头的前三个问题了,都是现将string转为了int,然后才进行的比较。

PHP强制类型转换

  1. string转int
var_dump(intval('2')) //2
var_dump(intval('3abcd')) //3
var_dump(intval('abcd')) //0
  1. int转int
$item = (string)$var;
$item2 = strval($var);
  1. Hash比较:在进行比较运算时,如果字符串开头遇到0e这种字符串,就会将这种字符串解析为科学计数法。所以上面问题4变成了两个科学计数法数字比较,刚好都是0
  2. 十六进制转换:一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较,0x1240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。

  PHP的弱类型确实使我们开发变得简单,但是用的时候还是要注意,以防发生上述问题。能用严格比较尽量用严格比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值