这是一个PHP bug吗?


Is this a 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.';
} 
?>

我总是得到"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']);