0

如果我尝试这段代码:

<?php

class ref
{

    public $reff = "original ";

    public function &get_reff()
    {
        return $this->reff;
    }

    public function get_reff2()
    {
        return $this->reff;
    }
}

$thereffc = new ref;

$aa =& $thereffc->get_reff();

echo $aa;

$aa = " the changed value ";
echo $thereffc->get_reff(); // says "the changed value "
echo $thereffc->reff; // same thing
?>

然后通过引用返回,对象属性的值也会$reff随着引用它的变量的$aa变化而变化。

但是,当我在不在类内的普通函数上尝试此操作时,它将无法正常工作!

我试过这段代码:

<?php

function &foo()
{
    $param = " the first <br>";
    return $param;
}

$a = & foo();

$a = " the second <br>";

echo foo(); // just says "the first" !!!

看起来该函数foo()无法识别它通过引用返回并顽固地返回它想要的东西!!!

通过引用返回是否仅在 OOP 上下文中有效?

4

2 回答 2

3

这是因为当函数调用完成并且函数对变量的局部引用未设置时,函数的作用域就会崩溃。对该函数的任何后续调用都会创建一个新的 $param 变量。

即使在函数中不是这种情况,您在the first <br>每次调用函数时都会重新分配变量。

如果您想证明引用返回有效,请使用 static 关键字为函数变量提供持久状态。

看这个例子

function &test(){
    static $param = "Hello\n";
    return $param;
}


$a = &test();
echo $a;
$a = "Goodbye\n";

echo test();

回声

Hello
Goodbye
于 2013-07-30T16:28:33.790 回答
0

通过引用返回是否仅在 OOP 上下文中有效?

不,PHP 是函数还是类方法都没有区别,通过引用返回总是有效的。

您提出的问题表明您可能还没有完全理解 PHP 中的引用是什么,众所周知,这可能会发生。我建议您阅读 PHP 手册中的整个主题以及至少两个不同作者的来源。这是一个复杂的话题。

在您的示例中,请注意您在此处返回的参考。当您调用该函数时,您始终设置$param为该值,因此该函数返回对该新设置变量的引用。

所以这更多的是你在这里问的变量范围问题:

于 2013-07-30T16:51:05.880 回答