什么是PHP引用
角色: 姓名:王笨笨 爱称:狗蛋儿
自我介绍:大家好,我是王笨笨,很高兴认识大家,大家可以叫我狗蛋儿。我就是我,不一样的烟火。
生涩的概念:引用就是别名,多个名字指向同一个变量内容,没有重复冗余的内存开销。
$a = 'runBaby'; $b = &$a; var_dump($a,$b); /* * string(7) "runBaby" * string(7) "runBaby" */
如何完美演绎BUG
bug:因为我们错误使用,导致错误。我们的工作是什么:写bug,找bug,改bug
无限循环···
背景:
PHP一般是web服务,在请求结束后会释放所有的资源,所以PHPer一般不用关心内存的释放。但是必须要重视,鸟哥说过:请手动释放你的资源(Please release resources manually)
虽然,在请求结束之后资源就自动释放了,我们不用太担心 内存泄漏 。但是在请求中,如果没有即时释放引用,那么引用将 一直存在 。
复现:
'A',
),
array(
'id'=>'B',
),
array(
'id'=>'C',
),
array(
'id'=>'D',
)
);
foreach ($array as &$value){
if($value['id'] == 'D'){
$value = 'DD';
}
}
$new_array = array();
foreach ($array as $key =>$value){
$new_array[$key] = $value;
}
var_dump($new_array);die;
预期数据:
打印信息:
实际数据和预期的有些差别啊 ,为什么最后一个重复了,不符合牛顿力学啊
前面实际已经埋下了伏笔,问题出现在: 引用没有释放。
第一个遍历:使用变量 $value
第二个遍历:使用变量 $value (同一个变量)
详解:(心路历程)
伪代码 :
$array = array( array( 'id'=>'A', ), array( 'id'=>'B', ), array( 'id'=>'C', ), array( 'id'=>'D', ), ); foreach ($array as &$value){ if($value['id'] == 'D'){ $value['id'] = 'DD'; } } $new_array = array(); foreach ($array as $key =>$value){ $new_array[$key] = $value; //数据 var_dump($array); }
仔细观察打印数据,发现$array[3],一直在变化,A -> B -> C -> C
变、变、变···看我七十二变
分拆步骤 :
//流程: //第一遍 $value = $new_array[0] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[0] 结果:A 、B、C、A //第二遍 $value = $new_array[1] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[1] 结果:A 、B、C、B //第三遍 $value = $new_array[2] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[2] 结果:A 、B、C、C //第四遍 $value = $new_array[3] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[3] 结果:A 、B、C、C
一首小曲总结:
想得却不可得 你奈人生何
该舍的舍不得 只顾著跟往事瞎扯
等你发现程序是错了 它早已偷光你的选择
~~~~
该来的我不推 该还的还 该给的我给
bug 你别催 调完就OK
及时unset,解除引用操作,避免问题出现,让我们远离bug,
让bug都随风,都随风,我心随你动~~~
unset($value); //舍得
海报
0 条评论
166
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~