是什么原因使用" @ $$ var = .."在这个PHP代码?

时间:2014-11-17 16:13:17

标签: php variable-variables

我有一些代码会返回错误Undefined variable: dblink

此代码来自遗留系统。 " DBLINK"变量仅出现在此文件中的此函数内。

function db_connect($dbhost, $dbuser, $dbpass, $dbname = "") {
    if (!strlen($dbuser) || !strlen($dbpass) || !strlen($dbhost))
        return null;

    @$$dblink = mysql_connect($dbhost, $dbuser, $dbpass);
    if ($$dblink && $dbname)
        @mysql_select_db($dbname);
    //set desired encoding just in case mysql charset is not UTF-8
    if ($$dblink) {
        @mysql_query('SET NAMES "UTF8"');
        @mysql_query('SET COLLATION_CONNECTION=utf8_general_ci');
    }
    return $$dblink;
}

我不完全确定@$$variable$$variable的内容。我假设@表示"抑制警告"和" $$变量"只是意味着" $ {$ value of $ variable}",这没有意义。

我打算将其重命名为$dblink,看看会发生什么。在早期的PHP版本中可能存在这样的历史原因,或者可能在某个时候这样的代码确实有意义,并且我的问题所寻求的答案是如何理解的。

1 个答案:

答案 0 :(得分:4)

这显然是错误的,但仍然有效:

$$foo = 'bar';
echo $foo; // Returns nothing
echo $$foo; // Returns bar
echo $$otherUndefinedVar; // Returns bar
echo ${''}; // Returns bar
echo ${NULL}; // Returns bar
if ($$foo) echo 'true'; // Returns true

这是因为PHP只会使用空字符串的默认值(在基于字符串的功能的上下文中),同时抛出$foo未定义的通知,然后您基本上使用名为的变量$(但如果不使用${''}则无法访问它。)

由于有通知被抛出,我打赌以前的开发人员使用@来抑制通知,而不会质疑为什么$$的使用不起作用。但我不是通灵者!

不幸的是我无法回答你的问题,因为它太宽泛了(就像我提到的,不是通灵者);但希望上面的代码示例清楚地说明为什么它仍然有效 - 这对于业余程序员来说是一个常见的问题“打败代码”直到它按照他们想要的方式工作。通常在这个过程中犯下非常非常糟糕的错误。