Why is function call by reference in PHP deprecated?

风流意气都作罢 提交于 2019-12-18 21:21:32

问题


I wrote the following code:

<?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));

    }

    ?>

I received this notice: Deprecated: Call-time pass-by-reference has been deprecated

I need an explanation why did I receive this notice? And why in PHP Version 5.3.13, this has been deprecated?


回答1:


This is all documented on the PHP Passing by Reference manual page. Specifically (added emphasis mine):

Note: There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.

As such, it was deprecated (and will throw a warning) in PHP 5.3.x and will fail in PHP 5.4.

That said, it's a trivial fix. Simply update your fix_names function as follows:

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

}

Incidentally, the 5.3.x series is getting quite long in the tooth, so it would be wise to update to a more recent build (after carrying out the necessary testing) if at all possible.




回答2:


Remove the & symbols from your like: &$n1, &$n2, ...




回答3:


use this....

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



来源:https://stackoverflow.com/questions/18046846/why-is-function-call-by-reference-in-php-deprecated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!