• JS中数组是引用传递
  • PHP资源和对象等数据类型是引用传递,其数据类型是值传递(包括数组)
  • 栈内存(快速内存)中存放标量数据类型,复合数据类型的变量名和数据地址

对象引用传递

1
2
3
4
5
6
$obj = new stdClass;
$obj->id = 1;
$new = $obj;
$new->id = 2;
var_dump($obj->id); // 2
var_dump($new->id); // 2

对象参数引用传递

1
2
3
4
5
6
7
function test($obj){
$obj->id = 2;
}
$obj = new stdClass;
$obj->id = 1;
test($obj);
var_dump($obj->id); // 2

值传递

1
2
3
4
5
$a = 1;
$b = $a;
$b = 2;
var_dump($a); // 1
var_dump($b); // 2
  • 循环时引用带来的问题
    循环时候由于前后两个循环的变量名字一样,第一个循环时候,实际上是数组中每个元素的值被作为引用传递过去,第二个循环时候,$value这个变量引用的是数组最后一个值,这样最后那个值实际上一直在跟着循环变化
1
2
3
4
5
6
7
8
9
10
$arr = [
1,2,3
];
for($arr as &$value){

}
for($arr as $value){
// var_dump($arr);
}
var_dump($arr); // 1 2 2

解决方法
把第二个循环也改成引用