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

Getting reference to array element where array is accessible as $obj->$propName

提问人:Jon 提问时间:6/5/2012 更新时间:6/5/2012 访问量:5712

问:

假设我们有以下代码(简化示例):

$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不会完全弄乱图形;如果您对引用不是非常小心,则可以忽略此未设置的要求,因此我想知道是否有一种方法可以编写此代码,从而减少引入错误的可能性。

PHP 数组 引用 变量

评论


答:

4赞 hakre 6/5/2012 #1

像这样的模棱两可的表达式需要解析器的一些帮助:

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

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

评论

1赞 Jon 6/5/2012
哎哟——我想过这个,但只尝试过哪个是编译时错误......PHP我现在更爱你了。谢谢:)&{$foo->$propertyName}[0]
0赞 hakre 6/5/2012
为您推荐: PHP 变量名称:疯狂大括号和一些相关的 SO 问题:stackoverflow.com/q/1147937/367456 ;stackoverflow.com/q/9844185/367456
0赞 Jon 6/5/2012
通常我会说“我知道”,但在这里“我应该知道”更合适。为了获得更多乐趣,请看一下这个: stackoverflow.com/questions/10333016/...
2赞 Jeroen 6/5/2012 #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)

我在这篇文章中找到了解决方案:在变量对象属性中引用数组,作者:Jeff Beeman

评论

0赞 Jon 6/5/2012
+1,谢谢你的回答。希望我能接受两者,但 hakre 更快。