您是否需要使用 & 修饰符来传递引用?
从技术上讲/语义上,答案是肯定的,即使有对象也是如此。这是因为有两种方法可以传递/分配对象:通过引用或按标识符。当函数声明包含 时,如:&
function func(&$obj) {}
无论如何,该参数都将通过引用传递。如果您声明没有&
function func($obj) {}
所有内容都将按值传递,但对象和资源除外,然后通过标识符传递。什么是标识符?好吧,您可以将其视为对引用的引用。举个例子:
class A
{
public $v = 1;
}
function change($obj)
{
$obj->v = 2;
}
function makezero($obj)
{
$obj = 0;
}
$a = new A();
change($a);
var_dump($a);
/*
output:
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
makezero($a);
var_dump($a);
/*
output (same as before):
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
那么,为什么在传递给整数后不会突然变成整数呢?这是因为我们只覆盖了标识符。如果我们通过引用:$a
makezero
function makezero(&$obj)
{
$obj = 0;
}
makezero($a);
var_dump($a);
/*
output:
int(0)
*/
现在是一个整数。因此,通过标识符传递和通过引用传递之间存在差异。$a