美文网首页PHP 开发
关于 PHP 引用的一个问题引发的思考

关于 PHP 引用的一个问题引发的思考

作者: 上善若水_f6a4 | 来源:发表于2020-02-29 21:46 被阅读0次

问题一

我们先来看一段代码:

$a=[1,2,3];   

foreach($a as &$v){

} 

foreach($a as $v){

}
var_dump($a);

我们来看一下运行结果是什么

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}

是不是和大家想的不一样。

我们注意到运行结果里面,数组的最后一个元素是带有引用,这就是出现这样结果的关键所在。

让我们来分析一下运行过程,当程序运行完第一个循环之后,由于循环的变量$v是引用类型,而在循环结束之后,变量 $v 会被保留下来,并且作为引用类型指向数组 $a 的最后一个元素。这样在执行第二个循环的时候,会将 $a[0]$a[1]的值依次赋值给 $v, 也即 $a[2]。所以在最后一次循环之前,$a[2] 的值变成了 2。而最后一次循环的时候,并不会改变 $a[2]的值,这样就得到了上面的结果。

总结
造成以上结果的主要原因是,如果循环使用的变量是引用类型的话,循环结束,这个变量会作为引用变量被保留下来,并且指向循环变量的最后一个元素。所以在循环外修改这个变量的话,会影响循环变量最后一个元素的值。
因此在写代码的时候,如果循环使用的变量是引用类型的话,在循环结束可以对变量进行 unset 操作,这样就不会有这样的问题了。

问题二

让我们再来看一段代码

$a=[1,2,3];
foreach($a as $v){
    $a[2] = 0;
    var_dump($a);
    var_dump($v);
}

让我们来看一下运行结果

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(0)
}
int(1)
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(0)
}
int(2)
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(0)
}
int(3)

然我們稍微改一下代码

$b = &$a[2];
foreach($a as $v){
    $b = 0;
    var_dump($a);
    var_dump($v);
}

运行结果如下

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(0)
}
int(1)
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(0)
}
int(2)
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(0)
}
int(0)

看出来不同了么?

对于第一段代码 Demo,在数组循环开始之后,在循环中修改数组的值不会影响循环;而如果有引用变量指向数组的元素,在循环中修改引用变量的值则会影响循环。

相关文章

  • 关于 PHP 引用的一个问题引发的思考

    问题一 我们先来看一段代码: 我们来看一下运行结果是什么 是不是和大家想的不一样。 我们注意到运行结果里面,数组的...

  • php函数如何返回引用?

    通过对Python的函数返回值返回的是值还是引用?的研究,引发了我对于php的函数返回值的思考:在php中,函数的...

  • 1、php引用变量

    1、PHP引用变量: 引用: Zval: 引用:recommend 画图分析法 关于引用的unset: 结果还是1...

  • php 引用遇到的问题

    最近遇到这样的问题 第一个foreach 首先理解&,它指向变量的内存地址,可以理解为C语言中的指针。ok ,先看...

  • 关于座位问题引发的社会思考

    让座这个现象一直是个老生常谈的问题,在这样的时代,面对这样的社会问题,真的让人担忧...... 案例一:前两天上海...

  • 关于一个面积问题引发的思考(2)

    在上一篇文章中,我阐述了之所以写这个话题的出发点,当我把文章写出来的时候,我发现我的疑问基本解决了,而当我把...

  • 关于一个面积问题引发的思考(1)

    【前言】 一个巧合的机会,让我与一位名师有了一段简短的对话,这段对话使我深刻的认识到自己在教学和学科知识的...

  • 用提问的方式,引发思考!

    有了问题,就会引发思考,如果没有思路的时候,就要去寻找问题。 比如,提了一个关于写作教练激发潜能的问题:为什么对写...

  • “饱醉豚”对谩骂的意义

    关于“饱醉豚事件”引发我对谩骂的思考,搜索了很多信息,我觉得胡适先生说的最为客观公正,以下引用一篇关于他的文章,以...

  • 一个问题引发的思考

    -01- “问你一个问题呗!” “说” “就是,人活着是为什么呢? 或者说人为什么活着?” “这个问题你马爷爷已经...

网友评论

    本文标题:关于 PHP 引用的一个问题引发的思考

    本文链接:https://www.haomeiwen.com/subject/gefihhtx.html