簡體   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