<?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
的引用值?
答案 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)
$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()
使其中一个变量无效。