php地址符&

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php地址符&相关的知识,希望对你有一定的参考价值。

 今天遇到一个很奇怪的问题

$arr=[‘a‘,‘b‘,‘c‘];
foreach($arr as &$v){
}
foreach($arr as $v){
}
var_dump($arr);
unset($v);

var_dump($arr);

这段代码相信咋一看都会以为输出的是abc

可是结果是:

array (size=3)
  0 => string ‘a‘ (length=1)
  1 => string ‘b‘ (length=1)
  2 => &string ‘b‘ (length=1)
array (size=3)
  0 => string ‘a‘ (length=1)
  1 => string ‘b‘ (length=1)
  2 => string ‘b‘ (length=1)
  重点在于

2 => &string ‘b‘ (length=1) 这个地方相当于给$v赋值为$arr[2]

原因在于&php的地址符

先来了解一下&的基本用法:

$b = $c = 1;
$a = &$b;
$a = 2;
echo "b=$b,c=$c\n";
$a = &$c;
$a = 100;
$a = 200;
echo "b=$b,c=$c\n";
unset($a);
$a = 500;
echo "b=$b,c=$c\n";
上面$a指定成$b的引用之后,除非再次指定成其他引用,或者unset($a),否则改变$a就是改变对应的$b的值。

对于你这个foreach,也是同样的道理,你把循环单步拆开,就是这个样子:

$v = &$arr[0];
$v  = &$arr[1];
$v  =  &$arr[2];

循环运行到最后的时候,$v是$arr[2]的引用,所以就相当于这么个形式:

$arr[0] = a;
$arr[1] = b;
$v = &$arr[2];
$arr[2] = b;
var_dump($arr);

也就不难理解为什么var_dump会在最后的键值对上打印出一个&的符号了吧。

以上是关于php地址符&的主要内容,如果未能解决你的问题,请参考以下文章

PHP foreach 循环使用"&$val" 地址符“&”

php中引用&的一个小实例

PHP引用符&的用法举例

php代码片段: sendFile/videoStream/sendEmail/phpexcel/ffmpeg/zip

php的foreach中使用取地址符,注意释放

超实用的php代码片段