2009-11-09 4 views
1

У меня есть функция, которая является более безопасным способом извлечения переменных, чем extract().PHP Extract2 - Как назначить vars в текущей таблице символов?

В основном вы просто указываете, какие имена переменных должны быть выведены из массива.

Проблема в том, как вы вставляете эти переменные в «текущую таблицу символов», как extract()? (т. е. локальная переменная scope внутри функции).

Я могу только сделать это, делая их глобальные переменные сейчас:

/** 
* 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; 

} 

Любая идея, как избежать глобального, но вместо этого вставить var в локальную область var?

+1

вопрос: использовать объекты? – yoda

ответ

1

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

extract(extract2()) 

Я не знаю точно, но я думаю, что функция extract() s является магии и трудно реплицироваться.

0

вы должны смотреть на this comment @ PHP док Это то, что вам нужно, я думаю, что

+0

Спасибо, что это хороший вариант, но трудно инкапсулировать в функцию ... так как вары не будут правильно определены. я буду играть с ним. – user10306

5

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

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

+0

Я согласен с гением. Похоже, что нет никакой веской причины для этого. Думаю, если бы вы могли как-то дать веские основания для этого, мы могли бы попытаться помочь вам больше. Но, на самом деле, вы используете больше ресурсов для чего-то более «удобного» (что, конечно, само собой, сомнительно). Подумайте о том, когда какой-либо другой опытный программист PHP когда-либо должен был изменить ваш код. Он был бы полностью потерян, задаваясь вопросом, откуда взялись переменные. – KyleFarris

+0

extract() достаточно сложно, я стараюсь избегать его во все времена, тем более его тиражируя. – pablasso

+0

templating. Представьте себе, что нужно вводить $ {SOMEARRAY ['somevar'}} 50 раз, а не $ somevar. – user10306