免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zvxcv
打印 上一主题 下一主题

PHP数组赋值是不是“写时拷贝”? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-12-26 11:28 |只看该作者
谢谢!这一问题终于得到了明确的解答,看来不仅对于数组,对于所有的变量都是如此,PHP的这种特性真是太好了!

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
12 [报告]
发表于 2006-12-26 11:37 |只看该作者
这个并不是特性,很多现代语言都用了copy on write。
不过在多线程的时候,会有一定的问题需要对待。

论坛徽章:
0
13 [报告]
发表于 2006-12-26 11:38 |只看该作者
原帖由 HonestQiao 于 2006-12-26 10:35 发表


  从内存入手,只是一个很直观的检查我们相法的一个方法。

  另外,我给出的这个手册的地方,是进行PHP扩展需要了解的一些知识,这个肯定是要从内部机制入手的。


都不知道老大把手册看了几遍了。崇拜中。。。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
14 [报告]
发表于 2006-12-26 11:39 |只看该作者
原帖由 yueliangdao0608 于 2006-12-26 11:38 发表


都不知道老大把手册看了几遍了。崇拜中。。。


  熟读百遍,其意自现。

论坛徽章:
0
15 [报告]
发表于 2006-12-26 12:12 |只看该作者
我的例子是指引用。

关于是否写时拷贝,,我举个例子。

<?php
$a = array(12);
$b= $a;
$b[1] = 'test';

?>

检测方法区别于乔的双眼放大器。请采用zend ,用f11
一步步来看。

当$b= $a时,,执行了这步,监测就能看到$b的结构发生变化

也就是执行完赋值后就将a结构数据copy给b了


至于写时copy,,$i++的类似操作时。。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
16 [报告]
发表于 2006-12-26 13:09 |只看该作者
原帖由 james.liu 于 2006-12-26 12:12 发表
我的例子是指引用。

关于是否写时拷贝,,我举个例子。

<?php
$a = array(12);
$b= $a;
$b[1] = 'test';

?>

检测方法区别于乔的双眼放大器。请采用zend ,用f11
一步步来看。

当$b= $a时 ...


我晕啊。

copyonwrite,是你改变了其数据内容的时候,才会在原有数据副本的基础上生成新的。
如果你根本不改变的话,那么还是原来的。

你用zend的f11来看,$b的结构是肯定会发生改变的,和$a完全相同。因为你给他赋值以前,他还没有初始化是不存在的。
你自己可以更加深入的调试,看看$b和$a所使用的数据空间是不是一样的,这样子可以更加确认。

论坛徽章:
0
17 [报告]
发表于 2006-12-26 13:30 |只看该作者
原帖由 HonestQiao 于 2006-12-26 13:09 发表


我晕啊。

copyonwrite,是你改变了其数据内容的时候,才会在原有数据副本的基础上生成新的。
如果你根本不改变的话,那么还是原来的。

你用zend的f11来看,$b的结构是肯定会发生改变的,和$a完全相同。 ...



你把它们都初始化,然后f11看。。

论坛徽章:
0
18 [报告]
发表于 2006-12-26 13:53 |只看该作者
咋这么费劲呢

也就是说 a 或者 b在没被改变之前,是不会产生副本的

你指的初始化是啥意思呢?

论坛徽章:
0
19 [报告]
发表于 2006-12-26 13:55 |只看该作者
原帖由 showsa 于 2006-12-26 13:53 发表
咋这么费劲呢

也就是说 a 或者 b在没被改变之前,是不会产生副本的

你指的初始化是啥意思呢?


$a=array(12);
$b=array();

论坛徽章:
0
20 [报告]
发表于 2006-12-26 14:03 |只看该作者
初始化又如何?不知道你向说明什么问题

这是是5.1版本之前的bug

Reproduce code:
---------------
<?php

$arr = array(1,2,3);
$arr["foo"] = array(4,5,6);
$copy = $arr;

unset($copy["foo"][0]);
print_r($arr);

?>

Expected result:
----------------
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [foo] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )

)

Actual result:
--------------
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [foo] => Array
        (
            [1] => 5
            [2] => 6
        )

)

现在已被fixed

希望你能从例子中理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP