繁体   English   中英

为什么chr(0x00)在PHP中被认为是真的?

[英]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 0false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM