返回信息流PHP7发布啦!撒花~
背景看以前的老帖吧: http://bbs.byr.cn/#!article/Linux/131124
还是那段程序:
<?php
// 创建两个数组。既然是按值拷贝语义,那么$a和$b应该是互补相干的两个数组。
$a = array(1,2,3);
$b = array(1,2,3);
$a[1] = "Long";
$b[1] = "time";
$x =& $b[1]; // 引用$b的一个元素
$c = $b; // 还是赋值。但是,这回真的还是按值拷贝吗?
$c[1] = "no";
// 下面就是见证奇迹的时刻。
print '$a='; print_r($a);
print '$b='; print_r($b); // !!!! 为什么!!!
print '$c='; print_r($c);
unset($x); // 不再引用数组元素。
unset($b); // 删除$b,减少一个引用。
$d = $c; // 还是赋值。现在又是怎么拷贝呢?
$d[1] = "see";
print '$c='; print_r($c); // $c和$d不影响。
print '$d='; print_r($d); // 怎么回事?又开始按值拷贝了?
?>
更新到了PHP7。
$ php --version
PHP 7.0.1 (cli) (built: Jan 3 2016 09:05:41) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
然后,用php执行上述代码,结果仍然是:
$a=Array
(
[0] => 1
[1] => Long
[2] => 3
)
$b=Array
(
[0] => 1
[1] => no
[2] => 3
)
$c=Array
(
[0] => 1
[1] => no
[2] => 3
)
$c=Array
(
[0] => 1
[1] => no
[2] => 3
)
$d=Array
(
[0] => 1
[1] => see
[2] => 3
)
看样子,PHP就算经历了5->7的大版本更新,也没能修改这个bug。阿弥陀佛[ema1]
PHP一路走好
p.s. 如果好奇为什么的话,可以看看原帖8楼,解释得很清楚: http://bbs.byr.cn/#!article/Linux/131124 主要问题是PHP混淆了“引用计数垃圾回收”和“引用计数的copy-on-write”。前者的引用是真的“引用”语义,后者本不应该让程序员知道的。但是,毕竟PHP“不是设计出来的”,是不断加功能凑出来的语言。原作者也承认:“I don’t know how to stop it, there was never any intent to write a programming language […] I have absolutely no idea how to write a programming language, I just kept adding the next logical step on the way.”
这是一条镜像帖。来源:北邮人论坛 / www-technology / #33393同步于 2016/1/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
我又来黑PHP了
nuanyangyang
2016/1/4镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
语言特性上PHP这门语言真的是烂成翔…之前没有左结合性,闭包用起来那叫一个食之无味弃之可惜啊…而且为毛PHP只有一种数据结构叫做Array,非要把所有的东西都塞到数组身上