[英]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.