使用“的原因是什么?”@$$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
,它就不再是函数之外的问题。