我只是想知道指向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]
任何人都知道为什么我不能直接索引变量变量使用返回的数组?
答案 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'];