亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4165 | 回復(fù): 12
打印 上一主題 下一主題

發(fā)現(xiàn)php的一個(gè)BUG.其實(shí)都好幾年了.有人說是trick(陷阱) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-10-08 11:42 |只看該作者 |倒序?yàn)g覽
這個(gè)bug是:
Foreach by reference bug
我今天偶然發(fā)現(xiàn)的,汗的是,查看手冊發(fā)現(xiàn)早就有人提出這BUG,而且到網(wǎng)上一搜發(fā)現(xiàn)此BUG的歷史還很悠久,可以追溯到2000年的php4.
bug相關(guān)鏈接:
http://bugs.php.net/bug.php?id=29992
http://bugs.php.net/bug.php?id=8373
測試代碼:
$a=array('a','b');
foreach($a as &$v){
}
foreach($a as $v){
    echo $v;
}


這個(gè)BUG真是奇
怪了.
ps:
有人說是trick(陷阱).貌似還是php官方推薦的使用習(xí)慣
真是自圓其說呀!
psps:
有搜了一下,原來php團(tuán)隊(duì)早就知道這個(gè),但就是不認(rèn)為是bug.不知道底層的原因是什么,難道和內(nèi)部機(jī)制有關(guān)?當(dāng)是php專有特性吧.小心就是了.


[ 本帖最后由 achun.shx 于 2008-10-8 12:08 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-10-08 12:33 |只看該作者
“貌似還是php官方推薦的使用習(xí)慣”
這個(gè)怎么用?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-10-08 12:38 |只看該作者
關(guān)鍵是循環(huán)引用后一定要有注銷引用的好習(xí)慣
比如

  1. $a=array('a','b');
  2. foreach($a as &$v){
  3. }
  4. //unset($v);
  5. $v='c';
  6. print_r($a);
復(fù)制代碼

這就出問題了



  1. $a=array('a','b');
  2. foreach($a as &$v){
  3. }
  4. unset($v);//注銷引用后這就不是問題的問題
  5. foreach($a as $v){
  6.     echo $v;
  7. }
復(fù)制代碼

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-10-08 12:57 |只看該作者
$a=array('a','b');
foreach($a as &$v){     

}

foreach ($a as $v) {
        echo $v;
}
print_r($a);    //最后添加這句你會(huì)看到 結(jié)果的 數(shù)組 $a已經(jīng)被改變了。

第一個(gè)循環(huán)結(jié)束后 $v是個(gè)指向數(shù)組$a[1] 的 也就是 ‘b’的位置。
當(dāng)?shù)诙䝼(gè)循環(huán)開始后 $a as $v第一次執(zhí)行就是 把 $a 的第一個(gè)元素 'a'拷貝給 $v,相當(dāng)于$v = $a[0] ,所以 $v 就變成了‘a(chǎn)’ ,你忘了在第一個(gè)循環(huán)結(jié)束時(shí)候的$v還是指向$a[1]的引用呢,所以成了$a[1] = $a[0],$a就被改變了。$a[1] 被改成 ‘a(chǎn)’ 就成你你看到的接過。

[ 本帖最后由 shitou254 于 2008-10-8 13:00 編輯 ]

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-10-08 16:19 |只看該作者
領(lǐng)教了。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-10-08 17:42 |只看該作者
那個(gè)不是bug,php的foreach就有這個(gè)用法
foreach ($arr as &$v) {
  $v='another value';
}

foreach ($arr as $key=>$v) {
  $arr[$key] = 'another value';
}
哪種簡單?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-10-17 13:44 |只看該作者

癥狀對,但樓上解釋的不對

<pre>
<?
$ar = array ( 1,2,3,4);

foreach ($ar as &$item)
{
        print_r($item);
}
foreach ($ar as $item)
{
        print_r($item);
}
print_r($ar);
?>

如果按照樓上的解釋,應(yīng)該打印
1231才對。但實(shí)際上打印的是1233

手冊里建議在foreach之后unset($item),確實(shí)可以工作。
但這個(gè)問題的癥狀很有趣

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-10-20 23:33 |只看該作者
不是bug,針對這個(gè)
《php5 Power Programming》
中文《 php5權(quán)威編程》 P26有很詳細(xì)的描述:
foreach($array as [$key =>] [&] $value)

設(shè)置&在值前面也是可選的,在你想更改$value的值,并在$array中也生效的時(shí)候,你就需要它。


雖然不是指針,但有這個(gè)味道。可以理解 引用傳遞。

6樓 并沒有錯(cuò),只是給你個(gè)實(shí)例看看,雖然不一定要這么用。

[ 本帖最后由 lendy 于 2008-10-20 23:40 編輯 ]

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-10-21 00:05 |只看該作者
關(guān)于
<?
$ar = array ( 1,2,3,4);

foreach ($ar as &$item)
{
        print_r($item);
}
//step 1
foreach ($ar as $item)
{
//step 2
        print_r($item);
}
print_r($ar);
?>
的理解:
step 1
$item 應(yīng)該指向 $ar[3]
然后的循環(huán)一直是沒變過。
第一次step 2循環(huán),把 $ar[0] 賦值給 $item ,這里 $item 是指向 $ar[3]的,所以$ar[3]=1
第二次step 2循環(huán),把 $ar[1] 賦值給 $item ,這里 $item 是指向 $ar[3]的,所以$ar[3]=2
。。。
第四次的時(shí)候
把 $ar[3] 賦值給 $item ,把 $ar[3]在第三次的時(shí)候不是已經(jīng)是3了啊,那不是自己在修改自己,還是3
你可以試試這個(gè)

<?php

$ar = array ( 1,2,3,4);

foreach ($ar as &$item)
{
        print_r($item);
        
}

foreach ($ar as $item)
{
        print_r($item);
        break;
}
print_r($ar);
?>

看看是不是1231


你也可以試試step 2的2次循環(huán)是不是1232

我覺得你應(yīng)該好好看看c的指針。

[ 本帖最后由 lendy 于 2008-10-21 00:14 編輯 ]

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2008-10-21 00:12 |只看該作者
然后看看這個(gè):

<?php

$ar = array ( 1,2,3,4);

foreach ($ar as &$item)
{
        print_r($item);
        break;
}

foreach ($ar as $item)
{
//step 2
        print_r($item); //r1
        
}
print_r($ar); //r2


?>

r1 和 r2打出來的東西不一樣
是在step 2 的第四次循環(huán)后才把 $ar[0] 的值給修改了,因?yàn)?$item 指向 $ar[0]。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP