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,这是正确的。 为什么?我在这里看不到任何逻辑。
答案 0 :(得分:2)
那么为什么PHP(bool)null返回false,但是(bool)chr(0x00)返回true?
它因为chr(0x00)
给你一个字符串长的字符串:
$ php -r "var_dump(chr(0x00));"
string(1) ""
然后(as per documentation)唯一的案例字符串在转换为布尔值时可以给false
是空的(所以长度为0)或者字符串保持" 0"作为其内容:
转换为布尔值时,以下值被视为FALSE:
空字符串,字符串" 0"
这不是这里的情况,因为我们的字符串没有保持0
也不是空的,因为它包含1个字符。因此它不能是false
,因此是true
。
修改强>
我假设您期望C
/ C++
类似于字符串0x00
终止的行为。这不是PHP中的情况。
答案 1 :(得分:1)
在PHP中,以下内容为false
:
""
(空字符串)0
(0为整数)0.0
(0作为浮动)"0"
(0为字符串)null
false
array()
(空数组) 其他所有内容均为true
。 chr(0x00)
会生成包含单个字符(NUL
字节)的字符串。这不是一个空字符串,也不是一个字符为0
的字符串,因此它不符合false
的条件。
尝试将字符串"\0"
(NUL
字节)转换为int
会导致0
,因为字符串中没有可解析的整数,所以结果是0
。 0
为false
。