【边学边用】PHP5函数参数的按引用传递

PHP是支持引用的,但是关于一个变量什么时候是引用,什么时候是值,我脑子里总是迷迷糊糊的,所以,想用引用的时候,就会不自觉地在所有的地方加上&符号,真的很累赘。为了缓解这个问题,我特意写了下面这个代码片段来增进自己的理解。起初,我对这个东西的理解是,对于对象来说,PHP5就是按照引用传递的。但是我现在想,可能事情不是这么一回事情。下面的代码片段中,$obj其实是A的对象的一个引用,可以理解成一个指针,函数参数$o,其实还是对$obj的拷贝,只是拷贝的是引用本身,也即,$o其实是$obj的拷贝,只是由于其拷贝了$obj,所以,$o也指向A的对象。两个指针指向一个地方,这也是为什么函数changeObj可以改变A的对象的原因。我想,这样大概从技术来说,会更加合理一点。

1
2
3
4
5
6
7

a = 3;
$o->b = 5;
}
changeObj($obj);
var_dump($obj);

执行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

object(A)#1 (2) {
["a"]=>
int(1)
["b"]=>
int(1)
}
object(A)#1 (2) {
["a"]=>
int(3)
["b"]=>
int(5)
}

然后再看一个普通变量的引用传递的例子,这个例子里面使用的是原生的整型变量,然后函数changeInt的函数声明里,也用一般方法声明参数,普通的调用,我们发现函数不能改变$x和$y的值,这符合我们的预期,但是第二个形式的调用,就是传参数时候,带上引用标志&,结果我们发现,$x和$y的值也改变了,这是为什么呢,跟上面的例子是一个原因,函数的形式参数a和b其实是$x和$y的引用的拷贝,所以a和b也指向x和y,所以,a和b可以改变x和y的值。再看最下面的一种形式,这种是我认为的真正的按照引用传递参数。非常的绕乎对吧?我也觉得如此,确实太过灵活了。确实不利于学习和理解,代码也不容易维护,如果真的想用引用传递参数,推荐用最底下一种方式,明确告诉调用的人,这里其实是引用,千万别用changeInt(&$x, &$y);这种形式,这个代码散步在各处,将极难定位bug。