提问人:Jon 提问时间:6/5/2012 更新时间:6/5/2012 访问量:5712
获取对数组元素的引用,其中数组可作为 $obj->$propName 访问
Getting reference to array element where array is accessible as $obj->$propName
问:
假设我们有以下代码(简化示例):
$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
不会完全弄乱图形;如果您对引用不是非常小心,则可以忽略此未设置
的要求,因此我想知道是否有一种方法可以编写此代码,从而减少引入错误的可能性。
答:
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 更快。
评论