在PHP中对象真的是按引用传递的吗

WBOY
发布: 2016-06-20 12:54:07
原创
871 人浏览过

在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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!