[英]Why chr(0x00) is considered as true in PHP?
已知0x00是空字符。
那么为什么在PHP (bool) null
返回false,但是(bool) chr(0x00)
返回true?
另一方面, (bool)intval(chr(0x00))
返回false。
以上内容适用于5.4和7.0.0 beta2之间的所有PHP版本,因此必须有一个原因。
编辑:我问这个问题,因为我在MySQL中有一个bit(1)
列,并返回字符0x00或0x01。
if ($test['bit1column'])
将始终通过,因为两个字符都被认为是真的,所以我被迫做一个if ($test['bit1column'] === chr(0x01))
。
至少对于使用MySQL 5.5.44的PHP 5.6,这是正确的。 为什么? 我在这里看不到任何逻辑。
那么为什么在PHP(bool)中null返回false,但是(bool)chr(0x00)返回true?
这是因为chr(0x00)
给你一个char长字符串:
$ php -r "var_dump(chr(0x00));"
string(1) ""
然后( 根据文档 ),当转换为布尔值时,唯一的case字符串可以给出false
是空的(所以length是0)或者是“0”作为其内容的字符串:
转换为布尔值时,以下值被视为FALSE:
空字符串,字符串“0”
这不是这里的情况,因为我们的字符串不保持0
也不是空的,因为它包含1个字符。 所以它不可能是false
,因此是true
。
编辑
我假设您期望C
/ C++
行为,其中字符串是0x00
终止。 PHP中不是这种情况。
在PHP中,以下内容是false
:
""
(空字符串) 0
(0为整数) 0.0
(0作为浮点数) "0"
(0作为字符串) null
false
array()
(一个空数组) 其他一切都是true
。 chr(0x00)
产生一个带有单个字符的字符串( NUL
字节)。 这不是一个空字符串而不是一个字符为0
的字符串,所以它不符合false
。
尝试将字符串"\\0"
( NUL
字节) NUL
转换为int
导致0
,因为字符串中没有可解析的整数,因此结果为0
。 0
是false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.