3

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

$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要求,因此我想知道是否有一种方法可以编写此代码,从而减少引入错误的可能性。

4

2 回答 2

4

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

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

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

于 2012-06-05T12:41:23.167 回答
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

于 2012-06-05T12:41:39.573 回答