PHP Extract2 - Как назначить переменные в текущей таблице символов? - PullRequest
1 голос
/ 10 ноября 2009

У меня есть функция, которая является более безопасным способом извлечения переменных, чем 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;

}

Есть идеи, как избежать глобального, но вместо этого вставить переменную в область локальных переменных?

Ответы [ 3 ]

5 голосов
/ 10 ноября 2009

Извините, если это звучит грубо, но я просто не вижу в этом необходимости.

Почему, о, почему бы вам захотелось бы сделать это? То, что вы пытаетесь сделать, это больше усилий и просто больше раздражает, чем использовать сам массив.

1 голос
/ 10 ноября 2009

Как насчет того, чтобы extract2 () возвратил чистый массив и запустил extract () для его результата?

extract(extract2())

Не знаю точно, но я думаю, что функция extract () волшебна и ее трудно воспроизвести.

0 голосов
/ 10 ноября 2009

вы должны взглянуть на этот комментарий @ php doc Это то, что вам нужно, я думаю

...