引用与赋值是两个概念:引用是共用同一个内存地址,一个改变其他也会变,赋值是另外开辟内存空间,一个改变其他不会变
一个简单例子:
$a=123; //$a开辟一个内存空间存储123 $b=&$a; //$b通过&引用$a的内存地址,所以是两者指向同一个地方 var_dump($b); //此时$b打印的值为123 $b=567; //当$b的值改变成567时,此时$a和$b共同指向的内存地址的值改变成567 var_dump($a); //所以$a打印的值为567
更深入的引入例子:
$data=['a','b','c']; foreach($data as $k=> $v){ $v = &$data[$k]; var_dump($data); } var_dump($data);
解答思路:
(1)首先第一次循环在未进入循环体时$v是指向一个内存地址,进入循环体后$data[0]是指向另一个内存地址,经过引用后$v引入了$data[0]的内存地址
输出a,b,c
(2)然后第二次在未进入循环体执行foreach这行代码时,$v的值为b,所以导致$data[0]变成了b
进入循环体后$v引用了data[1]的内存地址
输出b,b,c
(3)同理第三次在未进入循环体执行foreach这行代码时,$v的值为c,所以导致$data[1]变成了c,进入循环体后$v引用$data[2]的内存地址
输出b,b,c
所以整个流程的输出结果为: