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

时间:2015-07-24 18:12:26

标签: 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,这是正确的。 为什么?我在这里看不到任何逻辑。

2 个答案:

答案 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,因为字符串中没有可解析的整数,所以结果是00false