У меня есть функция, которая является более безопасным способом извлечения переменных, чем extract ().
По сути, вы просто указываете, какие имена переменных должны быть извлечены из массива.
Проблема в том, как вставить эти переменные в «текущую таблицу символов» , как, например, extract ()? (т. е. область видимости локальной переменной внутри функции).
Пока я могу сделать это, сделав их глобальными переменными:
/**
* Just like extract(), except only pulls out vars
* specified in restrictVars to GLOBAL vars.
* Overwrites by default.
* @param arr (array) - Assoc array of vars to extract
* @param restrictVars (str,array) - comma delim string
* or array of variable names to extract
* @param prefix [optional] - prefix each variable name
* with this string
* @examples:
* extract2($data,'username,pswd,name','d');
* //this will produce global variables:
* // $dusename,$dpswd,$dname
*/
function extract2($arr,$restrictVars=null,$prefix=false)
{
if(is_string($restrictVars))
$restrictVars=explode(",",$restrictVars);
foreach ($restrictVars as $rvar) {
if($prefix) $varname="$prefix$rvar";
else $varname=$rvar;
global ${$varname};
${$varname}=$arr[$rvar];
}
}
Использование:
extract2($_POST,"username,password,firstname");
echo "Username is $username";
Там, где вещи работают не так хорошо ... внутри функции:
function x($data)
{
extract2($data,"some,var,names,here");
//now the variables are are global, so you must:
global $some,$var,$names,$here;
}
Есть идеи, как избежать глобального, но вместо этого вставить переменную в область локальных переменных?