1

我有一个函数,它是一种比 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;

}

知道如何避免全局,而是将 var 插入本地 var 范围?

4

3 回答 3

5

如果这听起来很粗鲁,我很抱歉,但我认为没有必要这样做。

为什么,哦,为什么,你这样做吗?你试图做的是更多的努力,只是比使用数组本身更烦人。

于 2009-11-09T21:37:54.227 回答
1

让 extract2() 返回一个干净的数组并在其结果上运行 extract() 怎么样?

extract(extract2())

我不确定,但我认为 extract() 的功能很神奇且难以复制。

于 2009-11-09T21:36:48.420 回答
0

你应该看看这个评论@php doc 我认为这就是你需要的

于 2009-11-09T21:37:47.267 回答