You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中数组通过对象引用修改的行为是固定可保障的吗?

PHP对象赋值行为官方规范说明

结论

这个输出为2的行为是PHP官方明确保障的固定特性,PHP5及之后所有版本都遵循该逻辑,和优化器状态、内存占用、数组是索引数组还是关联数组等因素完全无关。

原理说明

两个示例的输出差异来源于PHP对不同类型变量的赋值规则不同:

  • 对于整数、浮点数、字符串、布尔值、数组这类基础数据类型,默认赋值逻辑为值拷贝:
    你给出的第二个示例中,$foo是整数类型,执行$arr[0] = $foo时会把$foo的取值1复制一份存入$arr[0]的独立内存空间,后续修改$arr[0]的取值不会关联到原变量$foo,因此最终输出为1。
  • 对于对象类型,默认赋值逻辑为对象标识符拷贝:
    从PHP5版本开始,所有对象变量存储的都不是对象本身,而是一个指向内存中实际对象实例的唯一标识符。执行$arr[0] = $foo时,仅拷贝这个标识符,也就是说$foo和$arr[0]会指向内存中的同一个对象实例。所以无论通过哪一个变量修改对象属性,都是修改同一个实例的内容,因此修改$arr[0]->a后,读取$foo->a得到的就是修改后的值2。

补充说明

如果你需要实现对象的赋值隔离,即修改赋值后的对象不影响原对象,可以使用clone关键字手动触发对象拷贝:

$arr[0] = clone $foo;
$arr[0]->a = 2;
echo $foo->a; // 此时输出为1

内容的提问来源于stack exchange,提问作者cr001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:45:03