传递变量引用的问题

时间:2013-08-16 08:43:35

标签: php

<?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的引用值?

5 个答案:

答案 0 :(得分:0)

是的,$conf中的requestFirst是引用,因此如果您在新的调用中使用该变量,它仍然是引用。

如果您使用var_dump($params),您会看到conf是参考array(1) {["conf"] => &int(2)}

答案 1 :(得分:0)

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

即。你有一个带有一个元素'conf'的数组,它是对$ conf的引用,所以当你调用$param['conf']++时,你在引用的$ conf上调用++而不是通过值传递HAS的数组。你的两个函数都按值btw获取参数。

我认为你的困惑在于&$conf确实意味着$conf的引用,但是如果你想要requestFirst,你将它分配给数组元素而不将它作为对requestFirst($params)的引用传递给requestFirst(&$foo)使用引用而不是使用{{1}}代替的值。

答案 2 :(得分: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
}

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

{{1}}

答案 3 :(得分:0)

当您执行requestSecond($params);时,$params是您传递给requestFirst的参数。您正在传递对int的引用,因此您的第二个函数也将接收此引用。这就是变量更新两次的原因。

答案 4 :(得分:0)

requestFirst中的

$conf是引用,当它传递给新函数时它仍然是引用。即使您将其分配给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$stillReference之间没有区别,两者都使用相同的内部变量容器。将这两者分开的唯一方法是使用unset()使其中一个变量无效。

相关问题