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 に答える