$s = 'abc';
$s[0] = '';
if ($s[0] !== '') {
echo 'emmm';
}
为什么$ string [0] =''不会产生$ string [0] ===''?
好像是$ string [0] ===“\ 0”,但更令人困惑..
答案 0 :(得分:4)
The manual确实指明了会发生什么:
写入超出范围的偏移量填充带有空格的字符串。非整数类型转换为整数。非法偏移类型会发出
E_NOTICE
。负偏移在写入时发出E_NOTICE
但读取空字符串。仅使用指定字符串的第一个字符。 分配空字符串指定NULL
字节。
(强调补充)
$str[42] = ..
表示法恰好用一个字节替换字符串中的一个字节。所有特殊情况都在手册中注明,如同分配任何内容(空字符串)的情况一样,在这种情况下会分配NUL
字节。
答案 1 :(得分:2)
$s[0]
可以访问字符串的单个字符。 ''
不是字符,它是字符串,因此分配失败。如果您尝试将FALSE
分配给$s[0]
,则会获得完全相同的行为。看起来PHP会尽力将您分配的任何值转换为单个字符。如果指定非空字符串,它将使用第一个字符。如果您指定一个数字,它将使用第一个数字。如果您指定值TRUE
,则会使用1
。
答案 2 :(得分:0)
Why $string[0] = '' is not resulting $string[0] === ''?
因为在这种情况下,空字符串将替换为ASCII代码NULL-byte
(\0
,ASCII 0
或0x00
)。当您使用空字符串设置字符串的一部分时,它将替换为0x00
。
如果你想比较可空字节,试试这个:
if ($s[0] !== chr('0')) {
# or
if ($s[0] !== "\0") {
答案 3 :(得分:-1)
当你设置$ s [0] ==''时,字符串已经改变,它是'\ 0bc',你知道'\'只在'\ n'之间转义,所以它是“\ 0”而不是'\ 0' ,''表示\ 0。