PHP foreach循环中引用(&)详解

it2024-04-08  45

PHP foreach循环中&引用详解

在正式讲解前我们先来看一个例子引用的释义例1讲解

在正式讲解前我们先来看一个例子

例1:

$arr = ['a','b','c']; foreach ($arr as &$v){} foreach ($arr as $v){} print_r($arr);

各位可以先自行思考上例输出的结果。

引用的释义

引用使用&进行符号表示,在PHP文档中对引用的解释为:

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址…… 查看引用不是什么了解更多信息。 替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接。PHP引用的解释

通俗的解释就是,若一个变量a引用了另一个变量b$a = &$b,那变量a就是一个引用变量,变量a的值此时指向了变量b。变量a的指针指向了变量b的内存地址。

再看上例的输出内容:

Array ( [0] => a [1] => b [2] => b )

从输出的结果可以看到此时的数组$arr的第三个元素变成了b。

例1讲解

那么数组为什么会变动呢? 因为第一个foreach的时候,$v是引用变量。 接下来让我们看一下,在循环里到底发生了什么。 第一个foreach的第一次循环,此时$v和$arr[0]的指针都指向$arr[0]的内存地址。 第二次循环,此时$v和$arr[1]的指针指向$arr[1]的内存地址。 第三次循环,此时$v和$arr[2]的指向$arr[2]的内存地址。 至此循环结束,但此时数组$arr[2]指针指向的是和变量$v指针相同的地址。 此时输出数组$arr正常,未发生变化

Array ( [0] => a [1] => b [2] => c )

虽然此时数组没变,但是数组的第三个元素指向的地址和引用变量$v相同了。 此时只要引用变量$v发生改变,则数组的第三个元素也会随之发生改变。

第二个foreach的时候,因为在前一个foreach中$v被声明为引用变量, 所以第一循环时,引用变量$v指向数组$arr[0],所以$v='a',数组的$arr[2]指向与引用变量$v相同,所以此时的数组已经变成如下所示:

Array ( [0] => a [1] => b [2] => a )

第二次循环时,引用变量$v指向数组$arr[1],所以$v='b',数组的$arr[2]指向与引用变量$v相同,所以此时的数组已经变成如下所示:

Array ( [0] => a [1] => b [2] => b )

第三次循环时,引用变量$v指向数组$arr[2],但是此时的数组$arr[2]的值在前一次的循环时已经被改变为'b'所以$v='b',数组的$arr[2]指向与引用变量$v相同,所以此时的数组已经变成如下所示:

Array ( [0] => a [1] => b [2] => b )

至此,第二个foreach循环完毕。

以上,个人关于foreach中&引用的理解。 若有错误,敬请斧正。

最新回复(0)