美文网首页
php 引用遇到的问题

php 引用遇到的问题

作者: 胡乱唱歌ing | 来源:发表于2020-03-23 17:34 被阅读0次

最近遇到这样的问题

$data = [1,2,3];
foreach ($data as &$v){}
foreach ($data as $v){}
print_r($data); //这里输出内容是什么 输出[1,2,2]

第一个foreach

首先理解&,它指向变量的内存地址,可以理解为C语言中的指针。ok ,先看看第一个foreach后,$data的内容
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(3)
}
从上面可以看出$data[2]类型&int(3),变成了存储$data[2]的内存指针,由于foreach 结束之后$v并不会马上注销掉的,因此第一次foreach后$v也指向了data[2]的引用
$v = &$data[2]

也就说第一个foreach结束后,$v转变成了内存地址的引用不是简单的变量赋值了。

第二个foreach

foreach ($data as $v){}
//遍历第一个元素
$v = $data[0]; //此时$data[0]的值赋给 $v,而$v指向$data[2]的内存地址会导致$data[2] = $data[0],那么此时的$data为[1,2,1]
//遍历第二个元素
$v = data[1];//同理,此时$data变成了[1,2,2]
//遍历第三个元素
$v = data[2];//同理此时$data变成了[1,2,2]

嗯嗯,看以下代码

$a['a'] = 123;
$b = &$a['a']; //此时的$a['a']为引用类型了
$c = $a;//c['a'] = a['a']也为引用类型
$c['a'] = 456; 
print_r($a);//输出456

再看以下代码

$a['a'] = 123;
$b = &$a;
$c = $a;//纯粹的赋值
$c['a'] = 456;
print_r($a);//输出123

思考为什么第一段代码输出456,第二段代码输出123?
答:$b = &$a['a'];与$b = &$a;的区别,前者把数组a的元素变成的引用类型,后者是把a变量变成了引用类型, 所以当执行到$c = $a;赋值运算时,前者的$b会包含引用类型,而后者则是正常的赋值。

总结

在foreach 循环中慎用& ,容易出现意想不到的bug
修改引用类型变量的值,会改变该引用变量所指向的内容

参考资料

https://learnku.com/articles/7001/php-ray-foreach-and-references-thunder
https://www.laruence.com/2018/04/08/3179.html

相关文章

  • php 引用遇到的问题

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

  • PHP中的检测数据类型有哪些?检测数据类型的几种方法

    PHP入门教程阶段,肯定会遇到PHP检测数据类型有哪些?检测数据类型有哪几种方法?之类问题,Java教程中,引用数...

  • PHP

    PHP 标签(空格分隔): 面试 PHP的引用变量的概念及定义 延伸: PHP引用变量的原理 概念:在 PHP 中...

  • PHP引用变量相关问题

    什么是引用变量? 在PHP中引用意味着用不同的名字访问同一个变量内容定义方式:使用&符号 1、普通变量赋值依据co...

  • php 内存引用,释放问题

    在一般的场景中,php作为一个脚本,执行完毕就会释放调所有的内存,所以一般我们也不会太考虑内存问题,对象 数组随便...

  • PHP数组循环引用问题

    $data = array(‘a’, ‘b’, ‘c’); foreach($data as $key=>$val...

  • 2018-08-14 PHP-命名空间的加载问题

    原由: 遇到这个问题,是前几天写了一个简单的php例子,由于没有使用框架,在B类引用A类的时候,发现提示:A类找...

  • composer引用私有git

    php开发中,会遇到需要引用公司内部开发的组件。内部组件放在私有git上,用以下方式引用:在项目composer....

  • 2. php基础-引用变量的考点

    引用变量的考点 真题: 什么是引用变量? 在PHP当中,用什么符号定义引用变量? 考点:PHP的引用变量的概念及定...

  • PHP面试 必背知识点-1

    1.PHP引用 什么是引用变量?在PHP当中,用什么符号定义引用变量? 对象本身就是引用传递,实例化以后的类如 $...

网友评论

      本文标题:php 引用遇到的问题

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