php - $a = $b = new stdClass() 与 $a = $b = [] 为什么区别那么大?
阿神
阿神 2017-04-11 09:10:33
[PHP讨论组]

先上两段代码

$a = $b = new stdClass();
$a->txt = '1111';
$b->txt = '2222';

echo $a->txt;    // 输出2222

dump出来看,$a 就是 $b

$a = $b = ['txt' => 0];
$a['txt'] = '1111';
$b['txt'] = '2222';

echo $a['txt'];    // 输出1111

dump出来看,$a 不是 $b

请问,如何解释这种现象?

阿神
阿神

闭关修行中......

全部回复(6)
高洛峰

PHP对数组有特殊的写时复制机制,而对象是没有这个机制的。

如果要让数组达到和对象一样的效果,可以使用引用完成。

$a = ['txt' => 0]);
$b = &$a;
$a['txt'] = '1111';
$b['txt'] = '2222';

echo $a['txt'];
巴扎黑
//如果要让对象达到和数组一样的效果
$a = new stdClass();
$b = clone $a;
$a->txt = '1111';
$b->txt = '2222';

echo $a->txt;    // 输出1111
高洛峰

第一个,$a$b是同一个对象,指向同一个地址,所以你就把它们看成同一个变量就好了。
第二个,数组在php里是写时复制的,所以它们指向不同的地址,所以它们不是同一个变量。

黄舟

楼主,改一改你的代码,第二种没看懂,代码不全啊,运行报错
https://www.bytelang.com/o/s/...

巴扎黑

你这个是复制的 ,所以变量的地址都是一样的,因此修改数据都会修改一个地方。

伊谢尔伦

因为数组默认是传值的,对象默认是传址。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号