每隔几年都要来学一遍,每次都是入门到放弃。直接上代码,懒得解释。
//常规脑回路,写的代码,抱歉了,bug 成堆
$list=array();
for($i=0;$i<10;$i++){
$obj=array();
$list[]=$obj; //后面会有 break 、return 等复杂逻辑,因此此处进行赋值代码量最少
$obj["val"]=$i;
//...一大堆复杂逻辑
}
//list= [{},{},{},......,{}]
数组对象这么重要的东西,默认进行赋值操作竟然是值拷贝。每赋值一次,就整个数组复制一遍。不能说这种方式不妥吧,就是感觉不那么好,说不上来的那种不好!
数组对象赋值采用引用的方式赋值,场景绝对比值拷贝多的多。需要做为全新的一个数组对象来对待的场景,完全可以显式的进行新数组的创建操作。直接就省去了很多麻烦。( PHP 也是老人家了,发了这么多版,随便出个 Array2 搞点完全不同的特性来糊弄我一下也行啊)
//修改代码,显式的进行引用。依旧是常规脑回路,写的代码,抱歉了,bug 还是成堆
$list=array();
for($i=0;$i<10;$i++){
$obj=array();
$list[]=&$obj; //后面会有 break 、return 等复杂逻辑,因此此处进行赋值代码量最少
$obj["val"]=$i;
//...一大堆复杂逻辑
}
//list= [{val:9},{val:9},......,{val:9}]
然后就有了,看似很屌,其实并没有多大卵用的:引用。有意思的是,它是按名字来引用,这个很关键,也很鸡肋。(在函数参数里面似乎有点儿卵用,就算没有引用传递这种东西,引用参数完全可以用别的带有引用性质的东西来代替)
//好了,这回正常了。不过,我的脑回路已经不正常了,劝退中
$list=array();
for($i=0;$i<10;$i++){
unset($obj); //强加的负担,迟早要翻车,漏了就反复调试来定位吧,一次写出的代码能用就怪了
//这种形式的引用方式,不要也罢:赋值一次,所有变量乱窜
$obj=array(); //如果你不是值拷贝,用得着引用?
$list[]=&$obj; //后面会有 break 、return 等复杂逻辑,因此此处进行赋值代码量最少
$obj["val"]=$i;
//...一大堆复杂逻辑
}
//list= [{val:0},{val:1},......,{val:9}]
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.