У меня есть код, который возвращает ошибку 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
, Я предполагаю что @
означает «подавлять предупреждения», а «переменная $$» просто означает «$ {значение переменной $}», что не имеет смысла.
Я планирую переименовать это просто $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
не определено, то вы по существу работаете с переменной с именем $
(но вы не можете получить к нему доступ без использования ${''}
.)
И так как было брошено уведомление, я держал пари, что этот предыдущий разработчик использовал @
подавить уведомление, не задаваясь вопросом, почему использование $$
не работал Но я не экстрасенс!
К сожалению, я не могу ответить на ваш вопрос, потому что он слишком широкий (и, как я уже говорил, не экстрасенс;), но, надеюсь, приведенный выше пример кода дает некоторую ясность в отношении того, почему он все еще работает — для программистов-любителей обычная проблема «победить» код вверх «, пока он не работает так, как они хотят. Часто допускает очень и очень плохие ошибки в процессе.
Других решений пока нет …