$a = $b = new stdClass() 与 $a = $b = [] 为什么区别那么大?

先上两段代码

$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

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

阅读 3.1k
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里是写时复制的,所以它们指向不同的地址,所以它们不是同一个变量。

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题