这是PHP中的错误,通过引用分配?

时间:2014-04-08 13:56:44

标签: php reference

以下是可能泄露PHP错误的代码的简化版本

class AClass
{
    public static $prop = "Hi";
}
function assignRef (&$ref)
{
    $ref = &AClass::$prop;
    echo "inside assignRef: $ref\n";
}
$ref = "Hello";
assignRef($ref);
echo "outside: $ref\n";

打印出来

inside assignRef: Hi
outside: Hello

不应该通过引用$ref类的$prop静态变量来分配AClass并成为"嗨"不只是在assignRef函数内部而且还在它之外?

1 个答案:

答案 0 :(得分:0)

您的示例中的类是无关紧要的简化版本,它产生相同的输出:

function assignRef (&$ref)
{
    $prop = 'Hi';
    $ref = &$prop;
    echo "inside assignRef: $ref\n";
}
$ref = "Hello";
assignRef($ref);
echo "outside: $ref\n";

正在发生的事情是,在函数($ref = &$prop;)内通过引用进行分配时,您只需更改一个变量所指向的内容,而不是更改它最初指向的值,也不会更改任何其他引用。原始价值。

在此示例中,您实际上有两个名为$ref的变量 - 一个在函数内部,一个在函数外部。您正在更改函数内部的变量指向的内容,而另一个变量指向原始(未更改)的值。

请考虑以下代码:

$a = 'a';
$b = 'b';
$c = 'c';

$a = &$b;
$b = &$c;
echo "$a / $b / $c";

这导致b / c / c的输出,而不是您期望的c / c / c。出现这种情况的原因相同 - 通过引用分配不会影响最初引用的值,也不会更改任何其他引用,这意味着指向原始值的任何其他变量都不会更改。

如果要更改值,而不是创建对其他值的新引用,则必须使用正常分配(=)。或者,您可以更改所有引用。