PHP 中'false'等于 true?

2017-06-20 11:27:29 +08:00
 iguoji

例子:'0' == false

PHP 官方文档中有这么描述

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

连接: http://www.php.net/manual/zh/language.operators.comparison.php

所以,'0' == false,我能理解

那么,'false' == true,我是不是应该理解为,先将'false'转成整数型

而将字符串'false'转成数字后,结果为0,为什么等于true呢?

参考: http://php.net/manual/zh/language.types.string.php#language.types.string.conversion

我该如何理解这个过程?

8410 次点击
所在节点    PHP
40 条回复
jihaiming
2017-06-20 11:32:29 +08:00
这里"false" 是字符串了
Scholer
2017-06-20 11:33:12 +08:00
'false' == true 既不是数字和字符串也不是涉及数字内容的字符串,所以这就是字符串和 bool 的比较,相当于 'a' == true
shooyaaa
2017-06-20 11:33:40 +08:00
官方文档里面说的规则仅限于字符串和数字比较的时候,并没有说和 bool 比较的时候也会转换为数字
harborM
2017-06-20 11:34:02 +08:00
‘ false ’是字符串,false 是布尔型
Light3
2017-06-20 11:36:46 +08:00
'false' 不是 false 你找个编辑器打一下啊 看看色都不一样 你就懂了 一个字符串 一个布尔
beyoung
2017-06-20 11:40:31 +08:00
非空字符串是 true 没毛病
iguoji
2017-06-20 11:41:58 +08:00
@jihaiming
@Scholer
@shooyaaa
@harborM
@Light3
@beyoung


所以是不是该这么理解?

当 纯数字组成的字符串 和 布尔型比较时, 会将该字符串先转成数字后再判断

当 不全部是或没有数字的字符串 和 布尔型比较时, 该字符串就不会转成数字
2ME
2017-06-20 11:45:00 +08:00
非要说理解的话 这就是 php 的规则 ‘ false ’ 就是一个普通的字符串 普通字符串和 bool 比较并不会类型转换
你也可以发布个自己的语言 规则: ‘ false ’被定义为一个特殊的字符串 会被转换成 bool 进行比较
话说之前有遇到过类似的面试题
Tokin
2017-06-20 12:44:40 +08:00
@jihaiming
@Scholer
@shooyaaa
@harborM
@Light3
@beyoung
我觉得楼主想表达的是'0'和'false'都是字符串,为什么'false'==true,'0'==false
Tokin
2017-06-20 12:49:42 +08:00
我试了一下,数字里面只有'0'是 false,'00'或者其它数字都是 true。
应该是 php 的规则限制了'0'
levn
2017-06-20 12:55:28 +08:00
不是转成数字而是转成布尔吧
rming
2017-06-20 13:09:56 +08:00
changwei
2017-06-20 13:13:03 +08:00
php,js,这种弱类型还自动转换的编程语言,最容易考倒人,楼下来人,快给楼主奉上九九真值表(ಠ .̫.̫ ಠ)
bumz
2017-06-20 13:13:53 +08:00
== 这个运算符就是用来坑人的
qiayue
2017-06-20 13:16:28 +08:00
楼主是一个七年全栈工程师 /t/339892
UnisandK
2017-06-20 13:18:01 +08:00
而将字符串'false'转成数字后,结果为 0

这个理解不能。。'0' 强转成 0 我能理解,'false' 转成 0 是什么鬼
misaka19000
2017-06-20 13:21:00 +08:00
哈哈,PHP 的程序员再次验证了 PHP 是世界上最好的语言
voocel
2017-06-20 13:31:02 +08:00
@UnisandK 那你觉得字符串'false'应该转成几
troywinter
2017-06-20 13:32:07 +08:00
https://www.designcise.com/web/tutorial/how-to-evaluate-string-false-in-php
"Anything other than these values will always return true when evaluated. It may be useful to mention here that casting to boolean type, or using the settype won't do the trick here because "false" (i.e. string false) is not type converted to boolean false. In fact it evaluates to true which is actually the correct interpretation. This is simply due to the fact that it is a non-empty string, that by definition is truthy. However, this may be problematic because a boolean false value transported to a PHP script would be received as a string "false" — not what one might expect in some cases."
jasontse
2017-06-20 13:35:03 +08:00
'false' 转成 ASCII 不是 0 所以不等于 false

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369755

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX