获取对数组元素的引用,其中数组可以作为$ obj-> $ propName访问

时间:2012-06-05 12:31:34

标签: php arrays reference variable-variables

假设我们有这个代码(简化示例):

$propertyName = 'items';
$foo = new \stdClass;
$foo->$propertyName = array(42);

此时我想编写一个表达式来计算对数组内部值的引用。

可以这样做吗?如果是这样,怎么样?

答案将“完成工作”但我正在寻找的是:

// Not acceptable: two statements
$temp = &$foo->$propertyName;
$temp = &$temp[0];

但为什么要把它写成两个陈述?好吧,因为这不起作用:

// Will not work: PHP's fantastic grammar strikes again
// This is actually equivalent to $temp = &$foo->i
$temp = &$foo->$propertyName[0];

当然&$foo->items[0]是另一个不可接受的解决方案,因为它修复了属性名称。

如果有人想知道奇怪的要求:我在循环中这样做,$foo本身就是对图中某个节点的引用。任何涉及$temp的解决方案之后都需要unset($temp),因此在下一次迭代中设置$temp并不会完全弄乱图表;如果你对参考文献并不十分小心,可以忽略这个unset的要求,所以我想知道是否有办法编写这段代码,以便引入错误的可能性较小。

2 个答案:

答案 0 :(得分:4)

这样的模糊表达需要解析器的一些帮助:

$temp = &$foo->{$propertyName}[0];

顺便说一句,无论你是在寻找变量别名(a.k.a. reference)还是只是值,这都是一样的。如果您使用数组访问表示法,两者都需要它。

答案 1 :(得分:2)

这需要一些谷歌搜索,但我找到了解决方案:

$propertyName = 'items';
$foo = new \stdClass;
$foo->$propertyName = array(42);

$temp = &$foo->{$propertyName}[0]; // note the brackets

$temp++;

echo $temp;
print_r($foo->$propertyName);

这将打印43 array(43)

我在本文中找到了解决方案:Referencing an array in a variable object property by Jeff Beeman