资讯专栏INFORMATION COLUMN

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

guyan0319 / 992人阅读

摘要:在中使用对象的时候,我们总是被告知默认情况下对象是按照引用传递的,其实这是个误区,不完全正确。我们从下面的示例来分析此时的关系此时的关系如果对象是按照引用传递的,那么输出的内容应该一样,事实上结果并非如此。

在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) |
 *        +------------+      +-----------------+
 */

var_dump($a); //["testB"]=> string(15) "Changed Class B"
var_dump($b); //["testA"] => string(15) "Changed Class A"
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) |
 *         +------------+      +-----------------+
 */

var_dump($aa); //["testB"]=>string(15) "Changed Class B"
var_dump($bb); //["testB"]=>string(15) "Changed Class B"
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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20992.html

相关文章

  • JavaScript深入之参数按值传递

    摘要:深入系列第九篇,除了按值传递引用传递,还有第三种传递方式按共享传递定义在高级程序设计第三版,讲到传递参数中所有函数的参数都是按值传递的。 JavaScript深入系列第九篇,除了按值传递、引用传递,还有第三种传递方式 —— 按共享传递 定义 在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数: ECMAScript中所有函数的参数都是按值传递的。 什么是按值传递呢?...

    DataPipeline 评论0 收藏0
  • 理解JavaScript变量和类型

    摘要:接着下一个例子赋予副本新的地址可见,函数参数传递的并不是变量的引用,而是变量拷贝的副本,当变量是原始类型时,这个副本就是值本身,当变量是引用类型是,这个副本是指向堆内存的地址。 转载自ConardLi: 《【JS进阶】 你真的掌握变量和类型了吗》 公众号: code秘密花园 1. JavaScript数据类型 ECMAScript标准规定了7种数据类型,这些数据类型分为原始类型和对象...

    xiaodao 评论0 收藏0
  • JS的值是按传递,还是按引用传递呢?

    摘要:按引用传递时,函数的形参接收实参的隐式引用,而不再是副本。探究值的传递方式的基本类型,是按值传递的。但这样是否说明的对象是按引用传递的呢我们再看下面的例子仍然是并未被修改为如果是按引用传递,修改形参的值,应该影响到实参才对。 最近遇到个有趣的问题:JS中的值是按值传递,还是按引用传递呢? 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(ca...

    Jochen 评论0 收藏0
  • 讲清楚之 javascript 参数传值

    摘要:讲清楚之参数传值参数传值是指函数调用时,给函数传递配置或运行参数的行为,包括通过进行传值。所以对的赋值会改变上下文栈中标识符保存的具体值此时如果使用的是按引用传递,则变量所指向的对象因该也被赋值为。 讲清楚之 javascript 参数传值 参数传值是指函数调用时,给函数传递配置或运行参数的行为,包括通过call、apply 进行传值。 在实际开发中,我们总结javascript参数传...

    itvincent 评论0 收藏0

发表评论

0条评论

guyan0319

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<