以下陈述之间的主要区别是什么?

时间:2010-10-03 18:27:01

标签: php

最近我正在研究“通过参考传递”,我开始了解以下方式

以下方法之间的主要区别是什么。

1

function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);

2

function foo($var)
{
    $var++;
}

$a=5;
foo(&$a);

3

function foo(&$var)
{
    $var++;
}
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());

即使它们都产生相同的结果,这也是最好的合作方式。

感谢。

3 个答案:

答案 0 :(得分:5)

function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);

这接受始终通过引用传递的参数(&foo(&$var)中)。传递$a时,它始终作为引用,因此在函数内增加变量将导致参数被修改。


function foo($var)
{
    $var++;
}

$a=5;
foo(&$a);

不要使用此功能。这是调用时传递引用(您将&$a(对$a的引用传递到函数中),从PHP 5.3.0开始,已弃用。这是不好的做法,因为该函数不会期望引用。


function foo(&$var)
{
    $var++;
}
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());

这会将引用(&&bar()中)返回到函数$a中声明的变量bar()。然后它引用bar()的返回值并递增它。我不确定为什么这会有用,特别是对于原始/标量类型。

答案 1 :(得分:3)

第二种方法已弃用,不应使用。

通常,函数应该只返回值。

function foo($a)
{
   $a = 5;
}

$a = foo($a);

这基本上就是第三种方法。不确定为什么你通过引用包含嵌入式传递。

通常应该避免通过引用传递(对于标量和数组),因为它不如返回值清晰。但是,在需要在一个函数调用中修改多个值时,它可能很有用。

请注意,在PHP5中,如果您只是想修改原始对象,则甚至不需要通过引用显式传递对象,因为对象的句柄将指向与传递给函数的对象相同的对象。 / p>

答案 2 :(得分:1)

最后一个例子不等同于前两个例子。如果在调用$a后打印foo的值,您会看到它未定义。第三个基本上是混淆的无操作。