3

[吐槽] PHP :哪天没有写 bug,算我输。数组哪里都是值拷贝;引用:蛋疼。明明是语言...

 2 years ago
source link: https://www.v2ex.com/t/822937
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  PHP

[吐槽] PHP :哪天没有写 bug,算我输。数组哪里都是值拷贝;引用:蛋疼。明明是语言问题,硬说是我太菜

  xiangyuecn · 2 天前 · 1056 次点击

每隔几年都要来学一遍,每次都是入门到放弃。直接上代码,懒得解释。

//常规脑回路,写的代码,抱歉了,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}]

php 代码:满屏的毫无意义的 $,满屏的毫无意义的两个字宽度的 -> ,代码看起来很肥 很保暖。

狗屁不是。可以:解决掉有问题的人,就没有问题了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK