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

2021-12-18 05:43:18 +08:00
 xiangyuecn

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

//常规脑回路,写的代码,抱歉了,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 代码:满屏的毫无意义的 $,满屏的毫无意义的两个字宽度的 -> ,代码看起来很肥 很保暖。

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

3178 次点击
所在节点    PHP
28 条回复
ivanfjz
2021-12-19 13:25:05 +08:00
你就狗屁不是~~
limingxinleo
2021-12-20 09:37:17 +08:00
只看了标题,内容我都没看,我就已经得出结论了,

这世界上没有适合你的语言!!!
wowbaby
2021-12-20 09:58:10 +08:00
我从没碰到过类似的问题,我怎么感觉代码执行没有问题啊,是你自己的问题吧?


$list=array();
for($i=0;$i<10;$i++){
$obj=array();
$list[]=$obj

$obj["val"]=$i;
}

为什么要这么写,又不是对象,能这么写,我头一次看到这样的?

应该是
$obj=array();
$obj["val"]=$i;
$list[]=$obj;

这样的顺序吧



$list=array();
for($i=0;$i<10;$i++){
$obj=array(); // 这里已经重置了
$list[]=&$obj;

$obj["val"]=$i;
}

//list= [{val:9},{val:9},......,{val:9}]

这段代码结果也没错啊,
elevioux
2021-12-20 10:25:38 +08:00
list[]=obj ,为什么要先赋值到 list 先呢?
obj 确定以后再赋值不就好了吗?也不用 unset ,引用啥的。
也可以 list[i][val]=1 来操作 obj 。

可能其他语言会有不同习惯,我一直写 php 都没留意。
sanggao
2021-12-20 10:57:40 +08:00
php 这么亲民友好的语言,你都玩不明白,的确 狗屁不是
Wenco
2021-12-20 13:03:58 +08:00
@elevioux

> //后面会有 break 、return 等复杂逻辑,因此此处进行赋值代码量最少

因为这个吧,他无法做到在最后一行将 obj 塞入 list ,又不想在每个跳出的地方重复写$list[] = $obj ,更不想优化自己的代码,所以只能吐槽 PHP 了
JaguarJack
2021-12-20 16:02:05 +08:00
不应该直接
```php

$list[] = array('val' => $i);

```
一行就完事了。看了半天才缓过来
NoahVI
2022-09-09 14:39:59 +08:00
@msg7086 这个是大佬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822937

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX