这是一个PHP错误吗?

这是一个PHP错误吗?,php,debugging,Php,Debugging,我总是发现PHP错误存在 <?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 /* PHP devs, test & tell me I'm crazy. */ $x[] = '1'; if (

我总是发现PHP错误存在

<?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 
/* 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错误

<?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错误

<?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 
/* 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错误

我认为这与您可以逐个字符访问字符串的方式有关

<?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 
/* 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 
/* 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.';
} 
?>
相当于

$x[0]['x']
由于您使用[]访问字符串,因此它会将索引转换为整数,在这种情况下,“x”将转换为0,因此它会提取第一个字符“1”

这里有一个演示:

$x = '1';
$x['x'];

这是因为您正在为数组分配字符串。因此,$x[0]['x']中的x会自动转换为0-记住,第二个索引不是指向数组,而是指向一个字符串,它不能有非数字索引

$x[0][0]确实存在-它是字符串的第一个字符

$x[0][1]不存在,如果您相应地更改索引,您的测试将返回正确的结果:

$x[] = '1';
var_dump($x[0]['x']);
教训:尽管字符串可以像数组一样访问,但它们不是数组

有一种解释这种行为的方法:

写入超出范围的偏移量会在字符串中填充空格。非整数类型转换为整数。非法偏移类型会发出E_通知。负偏移量在写入时发出E_通知,但读取空字符串。仅使用指定字符串的第一个字符。分配空字符串将分配空字节

这不是一个bug

if (isset($x[0][0])) echo "0 index is set."; 
if (isset($x[0][1])) echo "1 index is not set."; 
这使得数组如下所示:array1

所以$x[0]==“1”

当您执行$x[0]['x']时,您执行的是1['x']


< x >转换为0,1(0)=1,这不是空的。

你将标量转换成数组可能与此有关,所以你会认为这里的自动铸造是PHP错误吗?它按设计工作-有点不直观我同意你最初期望的行为会感觉更正确,但它的行为如所述