簡體   English   中英

傳遞變量引用的問題

[英]Issue with passing reference of variable

<?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參考價值?

是的, requestFirst $conf是引用,所以如果你在新的調用中使用該變量,它仍然是引用。

如果你使用var_dump($params)你會看到conf是引用array(1) {["conf"] => &int(2)}

該數組包含對$ conf的引用,這是您傳遞的內容。

即你有一個帶有一個元素'conf'的數組,它是$ conf的引用所以當你調用$param['conf']++你在引用的$ conf上調用++而不是通過值傳遞的數組。 你的兩個函數都按值btw獲取參數。

我想你混淆的來源是&$conf確實意味着參考$conf但你要分配這個數組元素不是把它當作一個參考requestFirst($params) ,如果你想requestFirst采取了參考,而不是一個值,你會改用requestFirst(&$foo)

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
}

當你在做requestSecond($params); $params是您傳遞給requestFirst的參數。 您正在傳遞對int的引用,因此您的第二個函數也將接收此引用。 這就是變量更新兩次的原因。

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()使其中一個變量無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM