<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = '1';
if (empty($x[0]['x'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
我总是得到"PHP bug存在"。
<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = 1;
if (empty($x[0]['x'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
输出"No PHP bug。"
<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = '1';
if (!isset($x[0]['x'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
输出"PHP bug exists."
<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = '1';
if (!isset($x[0]['hello world'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
输出"PHP bug exists."
这是因为您正在将字符串分配给数组。因此,$x[0]['x']
中的x
被自动强制转换为0
-记住,第二个索引不是指向一个数组,而是一个字符串,它不能有非数字索引。
$x[0][0]
确实存在——它是字符串的第一个字符。
$x[0][1]
是否不存在,如果您相应地更改索引,则测试返回正确的结果:
if (isset($x[0][0])) echo "0 index is set.";
if (isset($x[0][1])) echo "1 index is not set.";
教训:尽管字符串可以像数组一样访问,但它们不是数组。
PHP手册中有一个关于字符串行为的警告:
写入超出范围的偏移量在字符串中填充空格。非整数类型被转换为整数。非法偏移类型发出E_NOTICE。负偏移量在写时会发出E_NOTICE,但读取空字符串。只使用指定字符串的第一个字符。赋空字符串赋空字节。
这不是一个bug。
$x[] = '1';
array(1)
.
所以$x[0] == '1'
。
当你做$x[0]['x']
的时候,你也在做"1"['x']
。
将'x'
转换为0
和"1"[0] == "1"
,其中不为空
我认为这与您可以逐个字符访问字符串的方式有关。
$x[0]['x']
等价于
$x = '1';
$x['x'];
由于您正在使用[]
访问字符串,因此它将索引转换为整数,在这种情况下'x'将转换为0,因此它将提取第一个字符'1'
here a demo:
$x[] = '1';
var_dump($x[0]['x']);