在php中使用对象的时候,我们总是被告知“默认情况下对象是按照引用传递的”,其实这是个误区,不完全正确。php的对象变量存储的是此对象的一个标示符而不是对象值,通过此标示符可以访问真正的对象的内容,那么在对象作为参数被传递,作为结果返回,或者复制给另外一个变量时,其实传递的就是这个标示符,他们之间的关系是两个变量都保持了通一标示符的拷贝,而并不是引用。
我们从下面的示例来分析
phpclass a {};class b {};$a = new a;$b = $a; $b->testa = changed class a;/* * 此时$a,$b的关系: * +-----------+ +-----------------+ * $a --> | object id | ---> | object(class a) | * +-----------+ +-----------------+ * ^ * +-----------+ | * $b --> | object id | ---------+ * +-----------+ * * */$c = new b;$a = $c;$a->testb = changed class b;/* * 此时$a,$b,$c的关系: * +-----------+ +-----------------+ * $b --> | object id | ---> | object(class a) | * +-----------+ +-----------------+ * * +------------+ * $a --> | object id2 | -------------+ * +------------+ | * v * +------------+ +-----------------+ * $c --> | object id2 | ---> | object(class b) | * +------------+ +-----------------+ */echo object a: ; var_dump($a); //[testb]=> string(15) changed class becho object b: ; var_dump($b); //[testa] => string(15) changed class aecho object c: ; var_dump($c); //[testb]=> string(15) changed class b//如果对象是按照引用传递的,那么$a, $b, $c输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:testa = 2;/* * 此时$aa, $bb的关系: * * +-----------+ +-----------------+ * $bb --> | object id | ---> | object(class a) | * +-----------+ +-----------------+ * ^ * | * $aa ---------+ * * */$cc = new b;$aa = $cc;$aa->testb = changed class b;/* * 此时$aa, $bb, $cc的关系: * * +-----------+ +-----------------+ * | object id | ---> | object(class a) | * +-----------+ +-----------------+ * * $bb ---->-----+ * | * $aa ---->-----+ * | * v * +------------+ * | object id2 | --------------+ * +------------+ | * v * +------------+ +-----------------+ * $cc --> | object id2 | ---> | object(class b) | * +------------+ +-----------------+ */echo object aa: ; var_dump($aa); //[testb]=>string(15) changed class becho object bb: ; var_dump($bb); //[testb]=>string(15) changed class becho object cc: ; var_dump($cc); //[testb]=>string(15) changed class b//此时$aa,$bb,$cc三者内容完全一样,所以可以看出对象默认并不是按照引用传递,要尽快走出这个误区。
参考文章:http://php.net/manual/zh/language.oop5.references.php
http://weizhifeng.net/php-reference.html