最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP的foreach中使用引用時(shí)需要注意的一個(gè)問(wèn)題和解決方法

 更新時(shí)間:2014年05月29日 10:06:14   作者:  
這篇文章主要介紹了PHP的foreach中使用引用時(shí)需要注意的一個(gè)問(wèn)題和解決方法,即數(shù)組最后一個(gè)元素的值會(huì)發(fā)生改變的情況,需要的朋友可以參考下

一、問(wèn)題
先看一個(gè)例子:

<?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)
}
???為什么沒(méi)有進(jìn)行賦值操作,數(shù)組最后一個(gè)元素的值卻發(fā)生了改變呢?

我早就發(fā)現(xiàn)了這個(gè)問(wèn)題,一開(kāi)始以為是 PHP 的 bug,就扔著沒(méi)管它, foreach 中不使用引用就沒(méi)事, 用 foreach $k => $v 然后 $ar[$k] 來(lái)改變?cè)紨?shù)組, 略微損失點(diǎn)效率。

二、分析

今天花了點(diǎn)時(shí)間,看了 參考 中的文章, 算是稍微明白一點(diǎn)了,原來(lái)是這個(gè)樣子的:

在執(zhí)行第一個(gè)使用引用的 foreach 時(shí), 一開(kāi)始, $v 指向 $ar[0] 的存儲(chǔ)空間,空間內(nèi)存儲(chǔ)著 1 , foreach 結(jié)束時(shí), $v 指向 $ar[2] 的存儲(chǔ)空間,空間內(nèi)存儲(chǔ)著 3 。 下面要開(kāi)始執(zhí)行第二個(gè) foreach 了,注意和第一個(gè) foreach 不同, 第二個(gè) foreach 沒(méi)有使用引用,那么就是賦值方式, 即將 $ar 的值依次 賦值 給 $v 。 進(jìn)行到第一個(gè)元素時(shí),要將 $ar[0] 賦值給 $v 。 問(wèn)題就在這里,由于剛剛執(zhí)行完第一個(gè) foreach, $v 不是一個(gè)新變量,而是已經(jīng)存在的、指向 $ar[2] 的那個(gè) 引用 , 如此一來(lái),對(duì) $v 進(jìn)行賦值的時(shí)候,就將 $ar[0] = 1 寫(xiě)入了 $ar[2] 的實(shí)際存儲(chǔ)空間, 相當(dāng)于對(duì) $ar[2] 進(jìn)行賦值。 依此類(lèi)推,第二個(gè) foreach 執(zhí)行的結(jié)果, 就是數(shù)組的最后一個(gè)元素變成了倒數(shù)第二個(gè)元素的值。 參考文章 2 中有詳細(xì)的示意圖。

如果說(shuō)這是一個(gè)錯(cuò)誤,那么錯(cuò)誤的原因就在于對(duì)引用變量的使用。 當(dāng)引用變量指向和其他變量時(shí),改變引用變量的值當(dāng)然會(huì)影響到他指向的其他變量。 單獨(dú)說(shuō)誰(shuí)都明白,但在這個(gè) foreach 例子中,湊巧了, 同一個(gè)變量?jī)纱伪皇褂?,前一次是引用的身份,后一次是普通變量身份?就產(chǎn)生了意料之外的效果。 PHP 的開(kāi)發(fā)者也認(rèn)為,這種情況屬于語(yǔ)言特性造成的,不是 bug。 的確,如果要修復(fù)這個(gè)問(wèn)題,一種方法是對(duì) foreach 進(jìn)行特殊處理之外, 另外一種就是限制 foreach 中 $v 的作用域, 這兩種方式都與目前 PHP 的語(yǔ)言特性不符,開(kāi)發(fā)人員不愿改, 但還是在 官方文檔 中用 Warning 進(jìn)行了說(shuō)明。

三、解決方法

簡(jiǎn)單,但談不上完美,就是在使用了引用的 foreach 之后, unset 掉 $v , 開(kāi)始的例子改為:

<?php
$ar = array(1, 2, 3);
var_dump($ar);
foreach ($ar as &$v) {}
unset($v);
foreach ($ar as $v) {}
var_dump($ar);
?>
運(yùn)行結(jié)果:

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:https://bugs.php.net/bug.php?id=29992
References and foreach:http://schlueters.de/blog/archives/141-References-and-foreach.html

相關(guān)文章

  • thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】

    thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】

    這篇文章主要介紹了thinkPHP5.0框架整體架構(gòu),簡(jiǎn)單介紹了thinkPHP5.0的應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等概念與基本用法,需要的朋友可以參考下
    2017-03-03
  • typecho插件編寫(xiě)教程(五):核心代碼

    typecho插件編寫(xiě)教程(五):核心代碼

    這篇文章主要介紹了typecho插件編寫(xiě)教程(五):核心代碼,本文講解了完整的插件核心代碼的示例,需要的朋友可以參考下
    2015-05-05
  • 使用YUI+Ant 實(shí)現(xiàn)JS CSS壓縮

    使用YUI+Ant 實(shí)現(xiàn)JS CSS壓縮

    YUI庫(kù)是一組工具和控件,它們用JavaScript寫(xiě)成, 為的是用DOM 腳本,DHTML和AJAX等技術(shù)創(chuàng)建豐富的網(wǎng)頁(yè)交互式應(yīng)用程序。YUI 基于BSD協(xié)議,對(duì)所有的使用方式都是免費(fèi)的。YUI 項(xiàng)目包括YUI 庫(kù)和兩個(gè)創(chuàng)建時(shí)工具:YUI Compressor (壓縮)和YUI Doc(JavaScripts代碼的文檔引擎)
    2014-09-09
  • Laravel 5.5 的自定義驗(yàn)證對(duì)象/類(lèi)示例代碼詳解

    Laravel 5.5 的自定義驗(yàn)證對(duì)象/類(lèi)示例代碼詳解

    Laravel 5.5 將提供一個(gè)全新的自定義驗(yàn)證規(guī)則的對(duì)象,以作為原來(lái)的 Validator::extend 方法的替代。接下來(lái)通過(guò)示例代碼給大家介紹laravel 自定義驗(yàn)證對(duì)象和類(lèi),需要的朋友參考下吧
    2017-08-08
  • Laravel5.1 框架文件管理操作實(shí)例分析

    Laravel5.1 框架文件管理操作實(shí)例分析

    這篇文章主要介紹了Laravel5.1 框架文件管理操作,結(jié)合實(shí)例形式分析了laravel5.1框架文件管理相關(guān)的配置、磁盤(pán)獲取以及文件目錄操作技巧,需要的朋友可以參考下
    2020-01-01
  • 使用php計(jì)算排列組合的方法

    使用php計(jì)算排列組合的方法

    本文用PHP要解決的數(shù)學(xué)問(wèn)題是算出C(a,1) * C(b, 1) * ... * C(n, 1)的組合情況,其中C(n, 1)代表從n個(gè)元素里任意取一個(gè)元素
    2013-11-11
  • Laravel 5.4中migrate報(bào)錯(cuò): Specified key was too long error的解決

    Laravel 5.4中migrate報(bào)錯(cuò): Specified key was too long error的解決

    今天在執(zhí)行l(wèi)aravel migrate時(shí)出現(xiàn)異常,找了好半天才找到問(wèn)題所在,所以這篇文章主要給大家介紹了關(guān)于Laravel 5.4中migrate報(bào)錯(cuò): Specified key was too long error的解決方法,需要的朋友可以參考下。
    2017-11-11
  • PHP超低內(nèi)存遍歷目錄文件和讀取超大文件的方法

    PHP超低內(nèi)存遍歷目錄文件和讀取超大文件的方法

    這篇文章主要介紹了PHP超低內(nèi)存遍歷目錄文件和讀取超大文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • 深入淺析PHP7.0新特征(五大新特征)

    深入淺析PHP7.0新特征(五大新特征)

    PHP7將在2015年10月正式發(fā)布,PHP7 ,將會(huì)是PHP腳本語(yǔ)言的重大版本更新,同時(shí)將帶來(lái)大幅的性能改進(jìn)和新的特性,以及改進(jìn)一些過(guò)時(shí)功能。該發(fā)布版本將會(huì)專(zhuān)注在性能加強(qiáng),源自PHP版本樹(shù)中的phpng分支
    2015-10-10
  • destoon找回管理員密碼的方法

    destoon找回管理員密碼的方法

    這篇文章主要介紹了destoon找回管理員密碼的方法,需要的朋友可以參考下
    2014-06-06

最新評(píng)論

明水县| 滦平县| 隆化县| 沙坪坝区| 白银市| 德庆县| 乌兰县| 象山县| 临颍县| 兴仁县| 蓬溪县| 乃东县| 长寿区| 宁德市| 宁晋县| 黑水县| 武平县| 阳城县| 五大连池市| 建始县| 利川市| 乡宁县| 南溪县| 东海县| 霍林郭勒市| 惠安县| 班玛县| 正安县| 怀仁县| 恩平市| 抚州市| 白山市| 清涧县| 额尔古纳市| 城市| 日照市| 阿克苏市| 南丰县| 常宁市| 商南县| 华安县|