1

我只是想知道指向数组的变量变量如何处理。拿下面的代码:

$a = new stdClass(); 
$a->b = array('start' => 2); 
$c = 'b'; 
$d = 'start';
print $a->$c; // => Array
print $a->$c['start']; // => Array
print $a->$c[0]; // => Array
print $a->$c[0][0]; //=> PHP Fatal error:  Cannot use string offset as an array in php shell code on line 1

我期待的第一张印刷品,我不期待的第二张印刷品,或者第三张。在意识到 $a->$c 的评估显然是一个字符串之后,预计第 4 次。但是为什么这会起作用:

$t = $a->$c;
print $t['start']; //=> 2

我问的更多是因为我很好奇,而不是我需要知道如何做得好

$e = 'start';
$a->$c[$e]

任何人都知道为什么我不能直接索引到由变量变量使用返回的数组?

4

2 回答 2

1

它归结为操作顺序以及 PHP 类型如何处理。提示:var_dump是你的朋友,echo总是转换为字符串,所以它是分析变量值的最糟糕的操作,尤其是在调试设置中。

考虑以下:

var_dump($a->$c); // array (size=1) / 'start' => int 2
var_dump($a->$c['start']); // array (size=1) / 'start' => int 2
var_dump($a->b['start']); // int 2
var_dump($c['start']); // string 'b' (length=1)

这里的关键是 PHP 如何解释部分$c['start'](包括$c[0]这里)。$c是 string 'b',当尝试获取string '的'start'索引时,它只返回 string 中的第一个字符,它恰好是 string 中唯一的字母 (b)。您可以通过使用来测试它- 它会产生相同的结果(在这种特定情况下)。此外,将产生与;完全相同的东西 深思熟虑,并确保您完成了我链接到的必读内容。'b$c = 'bcdefg';$c['bogus']$c['start']

所以考虑到这一点(知道$c['start'] 不情愿地返回'b'),表达式$a->$c['start']被解释为$a->b也就是说,顺序是$a->($c['start'])而不是($a->$c)['start']

不幸的是,您不能使用(){}不能控制解析器(PHP SCREAM),因此您将无法在一行中完成您想要的。以下将起作用:

$e = 'start';
$interim = $a->$c;
echo $interim[$e];

或者,您可以将数组转换为对象(如果您有条件的话):

$a->$c = (object) $a->$c; // mutate
var_dump($a->$c->$e);

$interim = (object) $a->$c; // clone
var_dump($interim->$e);

...顺便说一句,关于$c['start']and $c[0]$c[0][0]您根本无法这样做,因为$c[0]是string 中的字符 ;访问字符/字节时,它不会具有.b'b'b[0]

于 2013-10-30T16:57:35.657 回答
0

$a->$c[0];实际上等于:array('start' => 0)

所以当你这样做时:

print $a->$c[0][0];

您正在尝试从不存在$a->$c[0]的索引加载数组元素。0

但是,这将起作用:

print $a->$c[0]['start'];

于 2013-10-30T16:40:09.597 回答