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
相关产品推荐
相关产品推荐

