巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+都会分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
赞助文档Help

PHP的foreach中利用援用时须要注重的一个题目和处置体例

一佰互联网站建造(www.taishanly.com) 宣布日期 2020-04-29 09:01:10 阅读数: 181

一、题目
先看一个例子:

<?php
$ar = array(1, 2, 3);
var_dump($ar);
foreach ($ar as &$v) {}
foreach ($ar as $v) {}
var_dump($ar);
?>
输入为:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}
???为甚么不停止赋值操纵,数组最初一个元素的值却发生了转变呢?

我早就发明了这个题目,一起头觉得是 PHP 的 bug,就扔着没管它, foreach 中不利用援用就没事, 用 foreach $k => $v 而后 $ar[$k] 来转变原始数组, 略微丧失点效力。

二、阐发

明天花了点时辰,看了 参考 中的文章, 算是略微大白一点了,本来是这个模样的:

在履行第一个利用援用的 foreach 时, 一起头, $v 指向 $ar[0] 的存储空间,空间内存储着 1 , foreach 竣事时, $v 指向 $ar[2] 的存储空间,空间内存储着 3 。 上面要起头履行第二个 foreach 了,注重和第一个 foreach 差别, 第二个 foreach 不利用援用,那末便是赋值体例, 行将 $ar 的值顺次 赋值 给 $v 。 停止到第一个元素时,要将 $ar[0] 赋值给 $v 。 题目就在这里,因为方才履行完第一个 foreach, $v 不是一个新变量,而是已存在的、指向 $ar[2] 的阿谁 援用 , 如斯一来,对 $v 停止赋值的时辰,就将 $ar[0] = 1 写入了 $ar[2] 的现实存储空间, 相称于对 $ar[2] 停止赋值。 依此类推,第二个 foreach 履行的成果, 便是数组的最初一个元素变成了倒数第二个元素的值。 参考文章 2 中有具体的表示图。

若是说这是一个毛病,那末毛病的缘由就在于对援用变量的利用。 当援用变量指向和其余变量时,转变援用变量的值固然会影响到他指向的其余变量。 零丁说谁都大白,但在这个 foreach 例子中,恰巧了, 统一个变量两次被利用,前一次是援用的身份,后一次是通俗变量身份, 就发生了料想以外的成果。 PHP 的开辟者也以为,这类环境属于说话特征形成的,不是 bug。 简直,若是要修复这个题目,一种体例是对 foreach 停止特别处置以外, 别的一种便是限定 foreach 中 $v 的感化域, 这两种体例都与今朝 PHP 的说话特征不符,开辟职员不愿改, 但仍是在 官方文档 顶用 Warning 停止了申明。

三、处置体例

简略,但谈不上完善,便是在利用了援用的 foreach 以后, unset 掉 $v , 起头的例子改成:

<?php
$ar = array(1, 2, 3);
var_dump($ar);
foreach ($ar as &$v) {}
unset($v);
foreach ($ar as $v) {}
var_dump($ar);
?>
运转成果:

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


参考

Bug #29992 foreach by reference corrupts the array:http://bugs.php.net/bug.php?id=29992
References and foreach:http://schlueters.de/blog/archives/141-References-and-foreach.html

一佰互联是天下着名建站品牌办事商,咱们有九年、网站建造、网页设想、php开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。最近几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。

相干消息more

17
05月
曾我做网站扶植时我就注重到了这些焦点要点?

window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":... >>概况

27
04月
php读取txt文件并将数据拔出到数据库

明天测试一个功效,须要往数据库中拔出一些原始数据,PM给了一个txt文件,若何疾速的将这个txt文件的内容拆分为所要的数组,而后再拔出到数据... >>概况

24
08月
上海惟有你商贸无限公司

D.Moment珠宝附属于上海惟有你商贸无限公司, D.Moment 寄意为“The Moment”或” “This Moment”, 让时... >>概况

18
04月
VPS计划挑选中Xen和KVM假造机法式的对

对XEN和KVMKVM是一个全假造化的处置计划。能够在x86架构的计较机上完成假造化功效。但KVM须要CPU中假造化功效的撑持,只可在具备... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751
建站

产物

域名注册 假造主机 云办事器 企业邮局
智能建站 APP打包 微站/小法式 创业平台
网站推行 媒体营销 智能收罗 AI机械人
400德律风 短信营销 店销机械人
私家定制 流派网站