常用知识 - 传对象时会传引用

  • 作者:KK

  • 发表日期:2016.9.1


介绍

PHP在传递object(对象)类型参数的时候会自动变成传引用

function xx($user){
	$user->age = 99;
}

$obj = json_decode('{"age" : 18}');
xx($obj);
echo $obj->age; //99

最后输出age为99是因为xx函数将age改成了99,说明函数里面对对象的修改会影响外面的$obj,其实外面传$obj变量进去的时候,并不是复制了一个$obj的值再传给xx函数,而是底层自动变成了传递$obj的引用


总结

PHP在传递对象参数时会传引用而不是传值,但非对象时(包括数组)则是直接传值而不是传引用

于是上面的代码如果xx函数是这样定义的话就多余了:

function xx(&$user){} ///如果参数是对象,就不需要加这个 & 号了

相关了解

  1. 另外嘛,很多框架的DB查询层在 select,from,where,limit,offset,groupBy,sortBy 这些方法上都支持链式编程,它们的实现就是在比如where后return $this来让外部继续执行下一步嘛

其实返回$this不会真的复制一个对象自身再返回出去,而是返回了自身的引用而已

  1. 而在JS里传数组、对象都会走引用,因为JS数组的本质就是对象