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 B"echo "object b: "; var_dump($b); //["testA"] => string(15) "Changed Class A"echo "object c: "; var_dump($c); //["testB"]=> string(15) "Changed Class B"//如果对象是按照引用传递的,那么$a, $b, $c输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:<?php$aa = new A;$bb = &$aa; // 引用 $bb->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 B"echo "object bb: "; var_dump($bb); //["testB"]=>string(15) "Changed Class B"echo "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