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

What was the reason to use "@$$var = .. " in this PHP code?

提问人:Dennis 提问时间:11/18/2014 最后编辑:sjagrDennis 更新时间:11/18/2014 访问量:60

问:

我有一些返回错误的代码: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”只是意味着“${value of $variable}”,这没有意义。@$$variable$$variable@

我打算将其重命名为 Just,看看会发生什么。在早期的PHP版本中,这可能有一个历史原因,或者也许这样的代码曾经有意义,而它如何有意义的答案是我的问题所寻求的。$dblink

php 变量

评论

0赞 Asik 11/18/2014
您已经回答了您的问题。@ 是不好的做法,那里不需要动态变量 $$。所以替换是$dblink并继续前进。
2赞 MatBailie 11/18/2014
I am planning to rename this to just $dblink and see what happens.- 我可以建议这是您在发布问题之前应该做的吗?
2赞 Dennis 11/18/2014
但这样就有意义了,毫无疑问
1赞 mario 11/18/2014
更有可能是错别字掩盖。 这里就成了空变量名。虽然您已经在修复代码,但请使用 PDO 调查重写。$$dblink${''}
0赞 GolezTrol 11/18/2014
我认为这可能是试图压制 .双重没有意义,特别是因为似乎不在范围内。也许这只是某人以前犯过的错误。如果不直接使用 的结果,这可能在很长一段时间内都没有引起注意。@mysql_connect$$$dblinkdb_connect

答:

4赞 sjagr 11/18/2014 #1

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

$$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$${''}

而且由于有一个通知被抛出,我敢打赌,以前的开发人员曾经压制过通知,而没有质疑为什么使用不起作用。但我不是通灵者!@$$

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

评论

1赞 Dennis 11/18/2014
嘿,很酷,我学到了一些东西。即,这个构造 => 。我以前没见过。${''}
0赞 sjagr 11/18/2014
@Dennis 变量有很多简洁的例子!值得注意的是,这也是
0赞 AbraCadaver 11/18/2014
除了在任何地方都没有定义。$dblink
0赞 sjagr 11/18/2014
@AbraCadaver 但现在是,所以仍然会验证。就该代码而言,除非在每种情况下都禁止显示通知,否则无法避免这些通知,但该功能仍将 100% 正常工作。一旦返回,它就不再是函数之外的任何地方的问题。$$dblinkif ($$dblink)@$$dblink