如何在PHP函数内设置引用?

时间:2009-03-25 05:36:05

标签: php reference

我正在尝试在函数中设置引用。但是,我无法使其发挥作用。

我试过的代码:

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。

2 个答案:

答案 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