为什么在PHP中函数的引用调用被弃用?

11

我写了以下代码:

<?php
    $a1 = "WILLIAM";
    $a2 = "henry";
    $a3 = "gatES";

    echo $a1." ".$a2." ".$a3. "<br />";

    fix_names($a1, $a2, $a3);

    echo $a1." ".$a2." ".$a3;

    function fix_names(&$n1, &$n2, &$n3)
    {
        $a1 = ucfirst(strtolower(&$n1));
        $a2 = ucfirst(strtolower(&$n2));
        $a3 = ucfirst(strtolower(&$n3));

    }

    ?>

我收到了这个通知:Deprecated: Call-time pass-by-reference has been deprecated

我需要解释为什么会收到这个通知?以及为什么在 PHP 版本 5.3.13 中被废弃?


https://dev59.com/Tm445IYBdhLWcg3w3Nwf?answertab=votes#tab-top - Telvin Nguyen
3
你在这里使用 call-time 传递引用的原因是什么? - Mark Baker
关于为什么(只是猜测):如果函数不期望引用,调用时传递引用可能会导致意外行为。 - Felix Kling
8
找到了官方原因: "在函数调用时通过引用传递参数已被弃用,这是为了保持代码的清晰度。如果函数没有声明参数将被按引用传递,则该函数可能以未记录的方式修改其参数。为了防止副作用,最好只在函数声明中指定哪些参数是按引用传递的。" - Felix Kling
就像看看会发生什么一样! - Muhammad Maqsoodur Rehman
3个回答

11

这些都在PHP的引用传递手册页面上有详细说明,具体来说(强调添加者自己加的):

注意:函数调用时没有引用符号,只有函数定义时才有。仅仅函数定义就足以正确地传递参数的引用。从PHP 5.3.0开始,在使用&来调用foo(&$a)时将会得到一个警告,提示“调用时通过引用传递”已被弃用。并且在PHP 5.4.0中,调用时通过引用传递已被删除,因此使用它将会导致致命错误。

因此,在PHP 5.3.x中,该功能已被弃用(并发出警告),而在PHP 5.4中将失败。

话虽如此,这是一个微不足道的修复。只需按以下方式更新您的fix_names函数即可:

function fix_names(&$n1, &$n2, &$n3)
{
    $a1 = ucfirst(strtolower($n1));
    $a2 = ucfirst(strtolower($n2));
    $a3 = ucfirst(strtolower($n3));

}

顺便提一下,5.3.x系列已经非常老了,如果可能的话,在进行必要的测试之后更新到更近期的版本会更明智。


2
虽然这解释了现状,但它并没有回答标题中的问题——为什么调用点引用被弃用。 - TheOperator
显然,这样做会使解析和解释变得不必要地慢。 - Heitor
1
更糟糕的是:当你编写函数时,没有明确的契约,无论是否安全或希望更改参数值。类似的调用将对传递的变量执行不同的操作,这些微妙的错误非常难以发现。幸运的是,这已经结束了。 - Thinkeye

0

从您的代码中删除&符号,例如:&$n1&$n2,...


-1

使用这个...

fix_names(&$a1, &$a2, &$a3);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接