假设我们有这个代码(简化示例):
$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
的要求,所以我想知道是否有办法编写这段代码,以便引入错误的可能性较小。
答案 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