【问题标题】:PHP pass by reference?PHP通过引用传递?
【发布时间】:2014-07-17 20:32:44
【问题描述】:

不久前,我用 php 编写了一个网站,现在正在我的网络服务器上设置它。当我写它的时候,一切都很好,但是现在,它产生了这些错误:

Strict Standards: Only variables should be passed by reference in /home/dragonto/public_html/source/navbar.php on line 4
class="current">Home Strict Standards: Only variables should be passed by reference in /home/dragonto/public_html/source/navbar.php on line 4
>About Strict Standards: Only variables should be passed by reference in /home/dragonto/public_html/source/navbar.php on line 4
>Contact Us Strict Standards: Only variables should be passed by reference in /home/dragonto/public_html/source/navbar.php on line 4
>Projects Strict Standards: Only variables should be passed by reference in /home/dragonto/public_html/source/navbar.php on line 4
>Tutorials 

我不确定这些是什么意思。我对在 PHP 中通过 ref 进行了研究,看起来我没有任何违规行为。这是有问题的脚本:

<?php
    function GetScriptName()
    {
        return end(explode("/", $_SERVER['SCRIPT_FILENAME']));
    }

    $Links = array(
                1 => array(1 => "Home",       2 =>     "index.php"),
                2 => array(1 => "About",      2 =>     "about.php"),
                3 => array(1 => "Contact Us", 2 =>   "contact.php"),
                4 => array(1 => "Projects",   2 =>  "projects.php"),
                5 => array(1 => "Tutorials",  2 => "tutorials.php")
            );

    echo "<nav>\n<ul>\n";

    foreach($Links as &$Link)
    {
        echo "<li";

        if($Link[2] == GetScriptName())
            echo " class=\"current\"";

        echo "><a href=\"" . $Link[2] . "\">" . $Link[1] . "</a></li>\n";
    }

    echo "</ul>\n</nav>\n";
?>

【问题讨论】:

  • return end(explode(...)) 将explode() 创建的数组作为引用传递给end() 函数。
  • 好的...为什么不起作用?
  • 它有效,但在较新的 php 版本中,您会收到警告,因为您不应该这样做。
  • 哦...好的。所以我只是暂时关闭警告并稍后修复它
  • 为什么在for循环中使用引用?我认为&amp;$Link 可以是$Link。为什么这会突然变成一个问题,很难说。可能服务器的 PHP 版本不同(引用变量的行为偶尔被修改过),或者配置不同,导致警告显得更冗长。

标签: php pass-by-reference


【解决方案1】:

问题在于对end 的调用,它通过引用获取其参数。但是在这个 sn-p 中,实际参数不是变量,因此不能通过引用传递。严格的标准警告对此有所抱怨。

此警告非常温和,尽管在任何情况下您都不应该让生产代码生成警告,但实际上您可以忽略它(代码仍按预期工作)。

不过也很容易把它关掉,手动引入一个变量:

$arr = explode("/", $_SERVER['SCRIPT_FILENAME']);
return end($arr);

在这种特殊情况下,最好通过使用 end 以外的东西来解决问题——在语义上也更准确的东西,例如

return basename($_SERVER['SCRIPT_FILENAME']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2015-07-04
    • 2011-05-24
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多