索引到PHP中的变量变量返回的数组

时间:2013-10-30 16:33:32

标签: php arrays variable-variables

我只是想知道指向Arrays的变量变量如何处理。请参考以下代码:

$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的评估显然是一个字符串之后,预计第四个。但那么为什么这样做:

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

我问的更多是因为我很好奇,而不是我需要知道怎么做好

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

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

2 个答案:

答案 0 :(得分: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是字符串'b',在尝试获取字符串'start'的{​​{1}}索引时,这只是returns the first character in the 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'],关于$c[0],你根本无法做到这一点,因为$c[0][0]是<字符串$c[0]中的em>字符 b;访问字符/字节'b'时,它不具有b的属性。

答案 1 :(得分:0)

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

所以当你这样做时:

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

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

然而,这将有效:

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