提问人:Dennis 提问时间:11/18/2014 最后编辑:sjagrDennis 更新时间:11/18/2014 访问量:60
在这个PHP代码中使用“@$$var = ..”的原因是什么?
What was the reason to use "@$$var = .. " in this PHP code?
问:
我有一些返回错误的代码: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
答:
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% 正常工作。一旦返回,它就不再是函数之外的任何地方的问题。$$dblink
if ($$dblink)
@
$$dblink
评论
I am planning to rename this to just $dblink and see what happens.
- 我可以建议这是您在发布问题之前应该做的吗?$$dblink
${''}
@
mysql_connect
$$
$dblink
db_connect