查看之前的代码如下:

//循环组装返回数据
    foreach ($rows as &$row){
        // 不知此处 & 的作用
    }

& 符号的作用

  • &是指逻辑上表示两者属于缺一不可的关系,还表示意思是一个人和另外一个人之意,与and同义。

  • &在PHP项目中是经常使用的一个操作符, 例如按位与丶逻辑操作丶引用变量丶引用传递丶引用返回。

按位与

$a & $b 将把 $a 和 $b 中都为1的位设为1.

条件操作符

$a && $b只有$a和$b均为真,结果才为真。

引用变量

PHP的引用允许你用两个变量来指向同一个内容。无论对哪个变量名的值进行了修改,其他变量名访问的内容也会随之改变。

与C语言中的指针是有差别的。C语言中的指针里面存储的是变量的内容,在内存中存放的地址。

  <?php
    $a = 10;
    $b = &$a; 
    $a = 11;
    var_dump($a, $b); // 输出11, 11
    $b = 12;
    var_dump($a, $b); // 输出12, 12

foreach循环时加&符号会有什么问题? 例如以下代码能正常输出期望值吗?

<?php
 $values = ['Python', 'Php', 'Go'];
   
  foreach ($values as &$value)
  {
	 
      $value = strtoupper($value);
	  
	   echo $value. PHP_EOL; // 输出 PYTHON PHP GO
	  
  }
   
  foreach ($values as $value){
      echo $value . PHP_EOL;  // 输出 PYTHON PHP PHP
  }

预期结果是: [‘PYTHON’, ‘PHP’, ‘GO’] 实际结果是[‘PYTHON’, ‘PHP’, ‘PHP’]。

这是因为第一次foreach中使用了引用, 使$value成为了引用变量, 并且$arr[2]和$value指向了同一个地址空间(共享变量值), 第二次foreach时, 不断的将$values中的值赋给$value, 导致$arr[2]的值也被修改了。

其他参考资料:

原文地址
其他扩展地址