PHP中对象是按值传递还是按引用传递?
2016-12-26 21:04
393 查看
1.首先,什么是按值传递和按引用传递?
按值传递就是仅仅把值传递过去,相当于传递的是值的拷贝,而按引用传递传递的是内存的地址。
按引用传递的特点:
2.现证明PHP中对象不是按引用传递:
3.但是,传递对象的时候,也出现了引用传递的特点:
出现这种情况的原因,是因为在PHP中,保存对象的结构是 zend_object,一个变量里实际保存的是指向该结构体的指针。变量传递的就是这个指针,这个指针指向的是同一个对象。
最后,简单说明下按值传递时,函数内产生的副本:
foo( $a ){
$a = 3;
}
按值传递的过程相当于:
foo( $a ){
$_a = $a;
$_a = 3;
/*接下来对$a的操作都是对$_a的操作*/
}
即:传值创建了副本_a,并修改了副本_a,变量a并没有改变。
由于_a为临时变量,会在函数返回时被回收掉。
按值传递就是仅仅把值传递过去,相当于传递的是值的拷贝,而按引用传递传递的是内存的地址。
按引用传递的特点:
$a = 2; $b = &$a; //按引用传递 $a = 1; echo $b; //1 $b = 3; echo $a; //3[/code]
2.现证明PHP中对象不是按引用传递:
class Test{ public $a ; } $test1 = new Test(); $test2 = $test1; $test1 = null; var_dump($test1); // null var_dump($test2); //object 如果是按引用传递,那么$test2也应该为空![/code]
3.但是,传递对象的时候,也出现了引用传递的特点:
class Test{ public $a ; } $test1 = new Test(); $test1->a = '1'; $test2 = $test1; $test2->a = '2'; echo $test1->a; //2 $test1->a = '3'; echo $test2->a; //3[/code]
出现这种情况的原因,是因为在PHP中,保存对象的结构是 zend_object,一个变量里实际保存的是指向该结构体的指针。变量传递的就是这个指针,这个指针指向的是同一个对象。
最后,简单说明下按值传递时,函数内产生的副本:
foo( $a ){
$a = 3;
}
按值传递的过程相当于:
foo( $a ){
$_a = $a;
$_a = 3;
/*接下来对$a的操作都是对$_a的操作*/
}
即:传值创建了副本_a,并修改了副本_a,变量a并没有改变。
由于_a为临时变量,会在函数返回时被回收掉。
相关文章推荐
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- 当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法
- Java - 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- python 对象拷贝——浅拷贝和深拷贝 之函数传递——值传递还是引用传递?
- 此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- JavaScript 函数参数传递到底是值传递还是引用传递
- C++和java类对象赋值----值传递还是址传递
- java参数传递时到底是值传递还是引用传递
- java的方法调用,参数是按值传递还是按引用传递