[英]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=3
, requestSecond($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.