【问题标题】:The object assignment doesn't make sense in PHP OOP对象分配在 PHP OOP 中没有意义
【发布时间】:2011-11-24 19:50:57
【问题描述】:
我接受了测试,我弄错了,但这没有意义:
class myClass
{
public $x;
function myMethod()
{
echo $this->x;
}
}
$a = new myClass();
$a->x = 10;
$b = $a;
$b->x = 20;
$c = clone $b;
$c->x = 30;
$a->myMethod();
$b->myMethod();
$c->myMethod();
我的直觉是 102030,但结果实际上是 202030!!! 10怎么了?!?!不应该单独留下 $a 的变量吗?我认为所有对象都是独立的,除非它具有由&符号(=&)设置的直接引用,否则不会被更新?
【问题讨论】:
标签:
php
oop
variable-assignment
【解决方案1】:
在$b = $a; 中,只有对象引用被复制,而不是对象。
但是,当您使用clone 时,对象确实被复制了,因此$c = clone $b, 会创建一个新对象(由$c 引用)和一个新引用($c)。
在$b =& $a; 中,两个符号$a 和$b 将指向同一个引用,也就是说,甚至不会复制引用(因此分配给$b 的,比如说一个整数,也会影响$a的值)。
总而言之,这里有两种间接方式:从符号到"zval"(在这种情况下是对象引用)和从对象引用到对象本身(即到实际对象所在的内存部分)状态被存储)。
【解决方案2】:
来自PHP manual:
将已创建的类实例分配给新变量时,新变量将访问与分配的对象相同的实例。将实例传递给函数时,此行为是相同的。可以通过克隆来制作已创建对象的副本。
【解决方案3】:
PHP 使用对象的引用。所以当你创建一个新的时
$a = new myClass();
PHP 实际上并没有将它存储在 in $a,它只是将引用放在那里。现在你复制参考:
$b = $a;
当你修改$a指向的对象时,你也修改了$b指向的对象,因为它们指向的是同一个东西。
【解决方案4】:
由于$a 表示对对象的引用而不是对象本身,因此您将引用分配给$b。现在,$a 和 $b 引用同一个对象,当您操作 $b 引用的对象时,更改也会反映通过 $a 访问它。
【解决方案5】:
对象由引用处理,引用在赋值时是别名。所以在你说$b = $a之后,两个变量都指向相同的对象。
值/引用的区别在许多“现代”面向对象语言中是基本的:值被复制,引用被别名。不幸的是,语言的语法并不总是清楚地表明变量在任何给定点遵循的语义。