PHP使用引用(&)时的一个小陷阱

描述:

$arr的为一个已知数组,$res为一个空数组。
先对 $arr 中每个值+1,打印$arr;再将 $arr 的每个元素分别传递给数组 $res,打印$res。

错误示例实现:

<?php
$res = array();
$arr = array(0, 1, 2, 10, 34);
foreach ($arr as &$val) {
    $val += 1;
}
var_dump($arr);
foreach ($arr as $val) {
    $res[] = $val;
}
var_dump($res);

结果分别为:

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(11)
  [4]=>
  &int(35)
}
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(11)
  [4]=>
  int(11)   //11 不是想要的,期望的是 35
}

解释:

  1. PHP 中的引用不同于 C 中的引用,C 中的引用是取址,PHP 中是将两个变量关联,指向同一块内存,操作其中一个也相当于操作了另一个。
  2. 以上代码中,第一次 foreach 中使用了引用,循环结束后,引用没有及时取消,$val 与 $arr[4] 绑定。
  3. 第二次 foreach 中,每次循环 $val = $arr[i] (i 指对应的索引值)(arr[4] 同
    $val)。
$val = $arr[0] ;//$arr[0] 为 1
$val = $arr[1] ;//$arr[1] 为 2
$val = $arr[2] ;//$arr[2] 为 3
$val = $arr[3] ;//$arr[3] 为 11,此处 $val 变为 11,即 $arr[4] 也为 11
$val = $arr[4] ;//$arr[4] 为 11,此处 $val 仍为 11

处理方法:

第一次 foreach 后,及时 unset($val),或者不要使用 $val(换个变量)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、数组 1、数组定义 数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。 $...
    空谷悠阅读 4,170评论 4 11
  • PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来...
    梦幻_78af阅读 6,380评论 1 10
  • 基本命令 win+R打开命令行,cmd进DOS窗口DOS命令开启关闭Apache和MysqlApache启动关闭命...
    Wizey阅读 4,026评论 3 5
  • 之前刷微博,看到一段话。 父母在,人生尚有来处。 父母去,人生只剩归途。 我...
    玖绺阅读 3,552评论 4 3
  • 曾经喊着难熬的三年,竟然就这样完结了。时光,树的年轮多了一圈,脸上的老练与沧桑又多了几分。经历三年,到底收获了什么...
    路子学姐读书阅读 2,498评论 0 0