我有一些代码会返回错误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版本中可能存在这样的历史原因,或者可能在某个时候这样的代码确实有意义,并且我的问题所寻求的答案是如何理解的。
答案 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
未定义的通知,然后您基本上使用名为的变量$
(但如果不使用${''}
则无法访问它。)
由于有通知被抛出,我打赌以前的开发人员使用@
来抑制通知,而不会质疑为什么$$
的使用不起作用。但我不是通灵者!
不幸的是我无法回答你的问题,因为它太宽泛了(就像我提到的,不是通灵者);但希望上面的代码示例清楚地说明为什么它仍然有效 - 这对于业余程序员来说是一个常见的问题“打败代码”直到它按照他们想要的方式工作。通常在这个过程中犯下非常非常糟糕的错误。