我正在尝试在函数中设置引用。但是,我无法使其发挥作用。
我试过的代码:
function set(&$x, &$y)
{
$x =& $y[2];
}
$y = array(
0,
1,
array('something')
);
$x = array('old_val');
print "1. inited, x is:\n";
print_r($x);
set($x, $y);
print "\n2. now, x is: ";
print_r($x);
输出:
1. inited, x is:
Array
(
[0] => old_val
)
2. now, x is: Array
(
[0] => old_val
)
我期望$ x的值与$ y相同[2]。此外,对$ x的任何进一步修改都应该改变$ y [2]。 (如C中的指针赋值:x = &y[2];
)
我究竟做错了什么?任何建议表示赞赏。
编辑: 实际上,测试代码中的函数set()是一个简化的函数,用于我的测试目的。它实际上是select_node(& $ x,& $ tree,$ selector):这将从树中选择一个匹配$ selector的节点并将其分配给$ x。
答案 0 :(得分:3)
引用不是指针,行为略有不同。
发生的事情是set()函数中的$ x变量被绑定到与$ y [2]相同的位置,但set()内的$ x与set()之外的$ x不同。它们都指向同一个位置,但是你只更新了set()内部的一个,一旦set()返回就不再相关了。没有办法绑定调用范围中的$ x,因为它在函数内部不存在。
请参阅:http://ca3.php.net/manual/en/language.references.arent.php
您可能希望声明set()以返回引用:
function &set(&$x, &$y) {}
并称之为:
$x =& set($x,$y);
请参阅http://ca3.php.net/manual/en/language.references.return.php
答案 1 :(得分:1)
这里没有错。函数 set()中的 x 是全局变量 x 的本地别名。换句话说,函数set()中的全局 x 和 x 指向相同的值。执行此操作后:
$x =& $y[2];
本地 x 现在指向 $ y [2] 的值,但全局 x 仍然指向旧值。您需要阅读此页面http://php.net/references