使用“的原因是什么?”@$$var=&引用;在这个PHP代码中?

使用“的原因是什么?”@$$var=&引用;在这个PHP代码中?,php,variable-variables,Php,Variable Variables,我有一些代码返回错误未定义变量:dblink: 此代码来自遗留系统。“dblink”变量仅出现在此文件中的此函数内部 function db_connect($dbhost, $dbuser, $dbpass, $dbname = "") { if (!strlen($dbuser) || !strlen($dbpass) || !strlen($dbhost)) return null; @$$dblink = mysql_connect($dbhost, $

我有一些代码返回错误
未定义变量: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
。我假设
@
表示“抑制警告”,“$$variable”仅表示“${value of$variable}”,这是没有意义的


我计划将其重命名为
$dblink
,看看会发生什么。在早期的PHP版本中,这可能是有历史原因的,或者可能有一段时间这样的代码是有意义的,而我的问题的答案就是它的意义所在。

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

$$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
未定义,那么您实际上是在使用名为
$
的变量(但如果不使用
${'}
,则无法访问它)

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


不幸的是,我不能回答你的问题,因为它太宽泛了(就像我提到的,不是通灵者),但希望上面的代码示例能够澄清为什么它仍然有效——业余程序员经常会“敲打代码”,直到它按照他们想要的方式工作。在这个过程中经常犯非常严重的错误。

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

$$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
未定义,那么您实际上是在使用名为
$
的变量(但如果不使用
${'}
,则无法访问它)

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



不幸的是,我不能回答你的问题,因为它太宽泛了(就像我提到的,不是通灵者),但希望上面的代码示例能够澄清为什么它仍然有效——业余程序员经常会“敲打代码”,直到它按照他们想要的方式工作。在这个过程中经常犯非常严重的错误。

您已经回答了您的问题。@这是一种不好的做法,不需要动态变量$$。因此,替换为$dblink并继续。
我计划将其重命名为$dblink,看看会发生什么。
-我可以建议您在发布问题之前应该这样做吗?但这样做是有意义的,而且毫无疑问,更可能是错误掩盖
$$dblink
将成为此处的空变量名
${'}
。当您已经在修复代码时,请调查使用PDO的重写。我认为
@
可能是试图抑制
mysql\u connect
的结果。双重
$$
没有意义,特别是因为
$dblink
似乎不在范围内。也许这只是以前有人犯过的错误。如果未直接使用
db_connect
的结果,这可能已经很久没有人注意到了。您已经回答了您的问题。@这是一种不好的做法,不需要动态变量$$。因此,替换为$dblink并继续。
我计划将其重命名为$dblink,看看会发生什么。
-我可以建议您在发布问题之前应该这样做吗?但这样做是有意义的,而且毫无疑问,更可能是错误掩盖
$$dblink
将成为此处的空变量名
${'}
。当您已经在修复代码时,请调查使用PDO的重写。我认为
@
可能是试图抑制
mysql\u connect
的结果。双重
$$
没有意义,特别是因为
$dblink
似乎不在范围内。也许这只是以前有人犯过的错误。如果没有直接使用
db_connect
的结果,这可能已经很久没有人注意到了。嘿,酷,我学到了一些东西。也就是说,这个构造=>
${'}
。我以前没见过。@Dennis这里有很多变量的好例子!除非
$$dblink
没有在任何地方定义。@abracadver但是
$$dblink
现在是,所以
if($$dblink)
仍然有效。正如代码所示,除非在每个实例中使用
@
抑制通知,否则无法避免这些通知,但该功能仍将100%工作。一旦返回
$$dblink
,它就不再是函数之外的问题了。嘿,酷,我学到了一些东西。也就是说,这个构造=>
${'}
。我以前没见过。@Dennis这里有很多变量的好例子!除非
$$dblink
没有在任何地方定义。@abracadver但是
$$dblink
现在是,所以
if($$dblink)
仍然有效。正如代码所示,除非在每个实例中使用
@
抑制通知,否则无法避免这些通知,但该功能仍将100%工作。一旦返回
$$dblink
,它就不再是函数之外的问题。