返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php灵异事件,啥都没干数据变了?
  • 954
分享到

php灵异事件,啥都没干数据变了?

php开发语言 2023-10-23 13:10:02 954人浏览 八月长安
摘要

这篇文章也可以在我的博客查看 搞WordPress,难免跟PHP打交道 然而这弱类型语言实在坑有点多 这不今儿又踩了个大坑直接时间-1😅 问题 话不多说直接上代码

这篇文章也可以在我的博客查看

WordPress,难免跟PHP打交道
然而这弱类型语言实在坑有点多
这不今儿又踩了个大坑直接时间-1😅

问题

话不多说直接上代码

php$items = [1,2];foreach ($items as &$item) {}print_r($items);foreach ($items as $item) {}print_r($items);

请问,最后的输出是什么?
答案是:

Array(    [0] => 1    [1] => 2)Array(    [0] => 1    [1] => 1)

不是,我啥也没干呢,发生什么事了?
我懂了,一定是我的注释把数据改了!(不是)

原因

原因其实有二,但凡php没那么“强大”都不会造成这个问题

  1. php支持“引用”,而非指针
  2. php的变量作用域由定义开始生效直到函数/文件结束,不存在代码块为基础的局部作用域(花括号)

同时满足这俩条件的语言好像还真蛮少的
因此我这不就暴毙了嘛

  1. 首先第一个循环,使用引用对$item赋值
  • 因此循环结束后,$item事实上是最后一个元素的引用
  1. 然后,循环结束后,$item没有因为循环结束而终止生命周期
  • 因此第二次循环的$item事实上还是指向最后一个元素的引用
  1. 最后,第二次循环没有使用引用赋值
  • 因此改变的不是引用指向,而是引用当前指向的值

因此,最后一个元素在第二次循环中被赋值了n次

测试

如果$items=[1,2,3],最后的结果是什么?
答案是:Array([0] => 1 [1] => 2 [2] => 2)

这个错误造成的不是第二次输出全部重复,而只是第n个元素被修改成n-1的值
跟着循环走一遍就很好理解:

  1. 第一步$item = $items[0] === 1,此时$items[2] === $item === 1
  2. 第二步$item = $items[1] === 2,此时$items[2] === $item === 2
  3. 第三步$item = $items[2] === 2(因为上一步)

谢谢你,我的PHP😅

参考资料

PHP Foreach Pass by Reference: Last Element Duplicating? (Bug?)

来源地址:https://blog.csdn.net/mkr67n/article/details/132510562

--结束END--

本文标题: php灵异事件,啥都没干数据变了?

本文链接: https://lsjlt.com/news/440372.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作