php的类型比较
感觉好久没写代码了,基础知识忘了差不多了,所以最近准备撸一遍PHP的官方文档,看到基础类型之间的比较的时候,它们之前进行的隐式自动转换,看得我很是迷茫,感觉以前就没怎么细看,今天写出来做个参考。
<?php
var_dump(0 == 'all'); // true
var_dump(true == 'all'); // true
var_dump(0 == true); // ?结果是什么鬼
?>
刚开始我有三大疑问
- 整型0为什么和字符串all相等
- 布尔型true为什么和字符串all相等
- 上面两个表达式的结果都是true了,为什么整型0和布尔型true不相等。
先不说为什么是这个结果,先说说==比较运算符,官方给出的解释为:
$a == $b 等于 TRUE,如果类型转换后 $a 等于 $b。
上面隐含的意思是,等号两边对比之前可能会进行类型转换,这也是==和===的区别,==判断的是(转换后)值是否相等,===判断值和类型是否全相等。
(1)、0 == ‘all’ //true
官网解释:
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。
于是乎也就不难理解了,0是整型数字,’all’是字符串,两者比较之前,字符串’all’转化为整型,也就是0,所以相等为true
(2)、true == ‘all’ //true
其实这些类型比较看多了,容易看懵逼,之前我看完上一个之后再看这个就是那样,上一个例子里面’all’隐式转换为了0,如果应用到这个里面, true == 0 结果怎么可能是真。
官方解释:还是上一个地址
当一个运算数是布尔型,一个是其它类型时,其他类型会转换为bool布尔型后再做比较,所以,既然字符串’all’非空字符串,非0字符串,自然’all’转换成布尔型为true, true == true 结果自然为真。
(3)、0 == true //false
其实这个就没必要来看了,上面已经做了解释了,只是当时上面的两个例子给搞懵逼了,也不知道这个该如何判断了,且不可认为,因为’all’和0相等,’all’和true相等,那么0 == true就相等了。就像是那句话,因为我(男)喜欢一个她(女),她喜欢他,那么我(男)喜欢他(男),不存在的。。。
好吧,这里既然等号右边为布尔型,那么整型0应该先转换为布尔型(false),然后与true做对比,结果为false。
其实坑还有很多,等以后收集好了再发出来。
上面这些纯属个人理解,欢迎指正。