4
<?php 
function requestSecond($param) {
    $param['conf']++;
}

function requestFirst($params) {
    $params['conf']++;
    requestSecond($params);
}

$conf = 1;
requestFirst(array(
    'conf' => &$conf,
));
echo $conf;

结果:3

问题:

我知道&$conf意味着通过引用$conf,所以我理解之后requestFirst($params),,$conf=2但我不明白为什么之后,,requestSecond($param)这是否也通过不值的引用?$conf=3requestSecond($param);$conf

4

5 回答 5

0

是的,$confinrequestFirst是引用,所以如果你在新调用中使用该变量,它仍然是引用。

如果你使用var_dump($params)你的意志,那conf是参考array(1) {["conf"] => &int(2)}

于 2013-08-16T08:49:57.983 回答
0

该数组包含对 $conf 的引用,这就是您要传递的。

即,您有一个包含一个元素“conf”的数组,它是对 $conf 的引用,因此当您调用时,$param['conf']++您是在引用的 $conf 上调用 ++,而不是按值传递的数组。顺便说一句,您的两个函数都按值获取参数。

我认为您的困惑&$conf确实意味着引用,但是如果您希望 requestFirst 获取引用而不是您将使用的值,则您$conf将其分配给数组元素而不是将其作为引用传递。requestFirst($params)requestFirst(&$foo)

于 2013-08-16T08:50:19.113 回答
0

当你在做的时候requestSecond($params);$params是你传递给的论点requestFirst。您正在传递对 int 的引用,因此您的第二个函数也将收到此引用。这就是变量被更新两次的原因。

于 2013-08-16T09:01:56.220 回答
0

requestFirst正在将参数数组的轻量级副本传递给requestSecond您所期望的。但是由于原始参数包含对 的引用$conf因此副本也包含引用。因此,当您修改该特定元素时,更改也可以通过对$conf变量的所有其他引用可见:

function requestSecond($param) {
    $param['conf']++;     // change to the int counter happens here
}

function requestFirst($params) {
    $params['conf']++;
    requestSecond($params);
    echo $params['conf']; // change is visible here
}

$conf = 1;
requestFirst(array(
    'conf' => &$conf,
));
echo $conf;               // change also visible here

但是,$param它本身仍然是 的副本,$params对其所做的任何更改都不会在以下范围之外可见requestSecond

function requestSecond($param) {
    $param['conf']++;
    $param['foo'] = 'bar';
}

function requestFirst($params) {
    $params['conf']++;
    requestSecond($params);
    echo (int)isset($params['foo']); // "0" -- change not visible
}

您甚至可以在增加数组后从数组中删除引用;对引用计数器的更改将保留,对数组的更改不会:

function requestSecond($param) {
    $param['conf']++;

    // remove the reference from the array -- this will only affect
    // the local copy $param and nothing else
    unset($param['conf']);
}

function requestFirst($params) {
    $params['conf']++;
    requestSecond($params);
    echo $params['conf']; // 3
}
于 2013-08-16T09:00:35.443 回答
0

$conf在 requestFirst 中是引用,当你将它传递给新函数时它仍然是引用。即使您将其分配给 requestFirst 中的局部变量,它也会被引用。

例如:

function requestFirst($params) {
  $params['conf']++;    
  $stillReference = $params; // $stillReference will also hold reference to $conf
  $local = array( 'conf' => $params['conf']); // This will be local and the output will be 2
  requestSecond($stillReference); //outputs 3
}

$params在上面的示例中, and和两者之间没有区别$stillReference,它们都使用相同的内部变量容器。将这两者分开的唯一方法是使用 使其中一个变量无效unset()

于 2013-08-16T09:05:10.510 回答