Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:奇怪的引用变量_Php_Reference - Fatal编程技术网

PHP:奇怪的引用变量

PHP:奇怪的引用变量,php,reference,Php,Reference,据我所知,当您将变量传递给函数时,如果不使用引用符号(&),则表示函数内部的任何更改都不会影响函数外部的变量。换句话说,这意味着编译器将复制外部变量以使用内部函数,不是吗 但当我运行这些测试代码时,它不会像那样发生。 谁能解释一下我错过了什么?多谢各位 我的测试代码:预期结果应该是3,但它变成了1 function test($arr2) { foreach($arr2 as &$item) { $item = 1; } } $arr = array(2)

据我所知,当您将变量传递给函数时,如果不使用引用符号(&),则表示函数内部的任何更改都不会影响函数外部的变量。换句话说,这意味着编译器将复制外部变量以使用内部函数,不是吗

但当我运行这些测试代码时,它不会像那样发生。 谁能解释一下我错过了什么?多谢各位

我的测试代码:预期结果应该是3,但它变成了1

function test($arr2) {
    foreach($arr2 as &$item) {
        $item = 1;
    }
}
$arr = array(2);

foreach($arr as &$item2) {
    $item2 = 3;
}

test($arr); 
print_r($arr);

即使您没有将$arr作为引用变量传递,您仍然可以在function test()中作为引用访问$arr元素。所以任何功能上的改变都会影响到外部功能


如果您希望仅在测试函数中更改$arr(在测试函数中已作为$arr2传递),那么从$item中删除(&R)

这非常有趣,似乎数组的行为与php中的对象相同,在php中,新数组仍然保留成员标识符的副本(它指向与从中复制它的数组相同的值)

从PHP 5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问器查找实际对象。当一个对象通过参数发送、返回或分配给另一个变量时,不同的变量不是别名:它们持有标识符的副本,该标识符指向指向同一个对象


在您提出此问题()之前,此问题已经解决了好几次。问题的原因是:

$value和最后一个数组元素的引用即使在 foreach循环。建议使用unset()销毁它

参考:

您需要在foreach之后取消设置最后一个
$item2

foreach ($arr as &$item2) {
    $item2 = 3;
}
unset($item2);

foreach($arr2 as&$item){
$item
中删除
&
可能的重复项并不是那么简单。如果我不运行以下行:foreach($arr as&$item2){$item2=3;}我将能够继续在test()中使用&$item,并且$arr值没有改变(如预期的那样)。为什么?:)是的,通过unset($item2);我们可以在这里解决这个问题,也可以用其他方法解决。但我想知道为什么$item2会影响test(),尽管我没有将其传递到test(),或者传递$arr的引用?@TranHuynh,因为您的测试正在拾取最后一个“引用的”
$item
当您在
$arr
上运行它时,谢谢Daren,实际上我现在很困惑。当我将$arr传递到test()中时。没有引用,在test()中它被称为$arr2=>所以$arr2和$arr是相互独立的,对吗?这意味着$arr和$arr2是两个不同的变量。但是为什么最后一个$arr引用是(称为$item2,外部测试())可以通过引用$arr2(称为$item,内部测试())来实现吗?