переменные переменные — что послужило причиной использования & quot; @ $$ var = .. & quot; в этом коде PHP?

У меня есть код, который возвращает ошибку 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 это может быть исторической причиной, или, возможно, когда-то такой код имел смысл, и ответ на вопрос, как он имеет смысл, — это то, что ищет мой вопрос.

0

Решение

Это явно не так, но все равно будет работать

$$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 не определено, то вы по существу работаете с переменной с именем $ (но вы не можете получить к нему доступ без использования ${''}.)

И так как было брошено уведомление, я держал пари, что этот предыдущий разработчик использовал @ подавить уведомление, не задаваясь вопросом, почему использование $$ не работал Но я не экстрасенс!

К сожалению, я не могу ответить на ваш вопрос, потому что он слишком широкий (и, как я уже говорил, не экстрасенс;), но, надеюсь, приведенный выше пример кода дает некоторую ясность в отношении того, почему он все еще работает — для программистов-любителей обычная проблема «победить» код вверх «, пока он не работает так, как они хотят. Часто допускает очень и очень плохие ошибки в процессе.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]