这是一个PHP错误吗?

时间:2011-12-22 22:54:29

标签: php debugging

<?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 
/* 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 (!isset($x[0]['hello world'])) {
  echo 'No PHP bug.';
} 
else {
  echo 'PHP bug exists.';
} 
?>

输出“存在PHP错误。”

3 个答案:

答案 0 :(得分:8)

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

$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."; 

课程:尽管字符串可以像数组一样访问,但它们不是数组。

warning in the PHP manual page on strings解释行为:

  

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

答案 1 :(得分:2)

这不是错误。

$x[] = '1';

这样就形成了一个数组:array(1)

所以$x[0] == '1'

当您执行$x[0]['x']时,您正在执行"1"['x']

'x'转换为0"1"[0] == "1"转换为非空。

答案 2 :(得分:0)

我认为这与你可以按字符访问字符串字符的方式有关。

$x[0]['x']

相当于

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

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

这是一个演示:

$x[] = '1';
var_dump($x[0]['x']);