在PHP中按引用返回

时间:2011-09-17 14:55:32

标签: php reference return

我尝试使用谷歌搜索,尝试了PHP文档,搜索SO以获得答案,但找不到任何令人满意的结果。我正在读一本书,其中作者使用了Return by Reference,但从未解释过它是什么。作者使用的代码是

function &getSchool() {
    return $this->school;
}

有人可以用简单的词语解释这个概念。

谢谢。

3 个答案:

答案 0 :(得分:30)

假设你有这个课程:

class Fruit {
    private $color = "red";

    public function getColor() {
        return $this->color;
    }

    public function &getColorByRef() {
        return $this->color;
    }
} 

该类有一个私有属性和两个允许您访问它的方法。一个按值返回(默认行为),另一个按引用返回。两者之间的区别在于:

  • 使用第一种方法时,您可以更改返回的值,并且这些更改不会反映在Fruit的私有属性中,因为您实际上正在修改属性值的副本。
  • 使用第二种方法时,实际上是回到 Fruit::$color 的别名 - 其他名称,您可以通过它来引用相同的变量。因此,如果您对它做任何事情(包括修改其内容),您实际上是直接对该属性的值执行相同的操作。

以下是测试它的一些代码:

echo "\nTEST RUN 1:\n\n";
$fruit = new Fruit;
$color = $fruit->getColor();
echo "Fruit's color is $color\n"; 
$color = "green"; // does nothing, but bear with me
$color = $fruit->getColor();
echo "Fruit's color is $color\n"; 

echo "\nTEST RUN 2:\n\n";
$fruit = new Fruit;
$color = &$fruit->getColorByRef(); // also need to put & here
echo "Fruit's color is $color\n"; 
$color = "green"; // now this changes the actual property of $fruit
$color = $fruit->getColor();
echo "Fruit's color is $color\n"; 

<强> See it in action

警告:我觉得有必要提一下,虽然它们确实有合法用途,但应该很少使用的功能之一,只有在您仔细考虑过任何替代方案的情况下才能使用第一。经验不足的程序员倾向于过度使用引用,因为他们看到他们可以帮助他们解决特定问题而不会同时看到使用引用的缺点(作为一个高级功能,其细微差别远非显而易见)。

答案 1 :(得分:14)

简易规则:如果您在PHP中的函数名前放置&,则可以在调用函数时使用&(即它的返回值)好像它是一个变量,而不是一个函数。

就是这样。


更容易将其视为“PHP允许您引用返回值”而不是PHP通过引用返回。如上所述,您只需放置&告诉PHP您想要这个,如果您不放置它并尝试$var =& somefunction(),您将收到错误“只应通过引用分配变量”。

与Jon的回答澄清一些混淆。实际上不需要有两个单独的函数,一个通过引用返回,一个按值返回;在一些项目大会之外。 &只有允许通过引用返回,它不会强制它通过引用返回。

例如。相同的函数用于参考和非参考分配

\header('content-type: text/plain');

class Demo
{
    protected $example = 'original value';

    function & example()
    {
        return $this->example;
    }
}

$demo = new Demo;

#1 - pass by value

$var1 = $demo->example();
$var1 = 'var1 value';

echo '$demo->example() => '.$demo->example().PHP_EOL;
echo PHP_EOL;

#2 - pass by reference

$var2 =& $demo->example();
$var2 = 'var2 value';

echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo PHP_EOL;

#3 - altering other references

$var3 =& $demo->example();
$var3 = 'var3 value';

echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo '$var3 => '.$var3.PHP_EOL;
echo PHP_EOL;

exit;

<强>输出

$demo->example() => original value

$demo->example() => var2 value
$var1 => var1 value
$var2 => var2 value

$demo->example() => var3 value
$var1 => var1 value
$var2 => var3 value
$var3 => var3 value

参考文献很棒,但如果您不熟悉它们,请遵循以下规则:

  • 如果您正在处理大型数组或类似的非对象数据结构,则只考虑使用引用
  • 永远不会引用某个对象(如果可以避免的话)
  • 只允许函数通过引用传递,如果值在对象的静态属性或属性中维护(即,它不是函数内的临时变量)

异常显然是非常实用的用法(即当你真的想要共享一个值来简化操作它的代码时)。

再次,永远不会引用对象(这是毫无意义的!)

答案 2 :(得分:3)

您发布的示例可能来自PHP4或更早版本。不再需要通过引用返回对象,因为它们几乎总是在PHP5 +中自动完成。

  

当您想要使用函数时,通过引用返回很有用   找到应该绑定引用的变量。不使用   按引用返回以提高性能。引擎会   自动优化它。仅在返回时引用   你有充分的技术理由这样做。

请参阅return references in PHP docs