2011-03-23 133 views
1

下面的函数接受一个数组并检查它的键和值是否与指定的数据类型匹配。PHP lambda函数和范围

我似乎在以前工作的内部lambda函数有一些问题。我正在运行PHP v5.3.6。他们上次在v5.3.4下工作。他们抱怨说,未通过的变量不在范围之内。如果我重申该变量为global那么错误消失,但该变量是空的。

/** 
* @param array $arr, array to be tested 
* @param mixed $keytype 
* @param mixed $valuetype 
* @example acceptable_arr(array(1,2,3,4,'string'), NULL, 'integer') returns false 
* @example acceptable_arr(array('thing'=>1,'other'=>2), 'string', 'integer') returns true 
* @example acceptable_arr(array('thing'=>1,'other'=>2), 'string', 'array') returns false 
*/ 
function acceptable_arr(array $arr,$keytype=NULL,$valuetype=NULL){ 
    print_r(func_get_args()); //debugging 

    $valfail=true; $keyfail=true; 
    if($keytype==NULL && $valuetype==NULL) return true; 

    if(!is_null($keytype)) { 
     $keytest='is_'.$keytype; 
     if(function_exists($keytest)){ 
      $fn_kfail=function($v){return call_user_func($keytest,$v);}; //PROBLEM LINE 218 
      $keyfail=(!is_null($keytype)) ? array_sum(array_map($fn_kfail,array_keys($arr))) : false; 
     } 
    } 

    if(!is_null($valuetype)) { 
     $valtest='is_'.$valuetype; 
     if(function_exists($valtest)){ 
      $fn_vfail=function($v){return call_user_func($valtest,$v);}; //PROBLEM LINE 226 
      $valfail=(!is_null($valuetype)) ? array_sum(array_map($fn_vfail,$arr)) : false; 
     } 
    } 

    return !($valfail && $keyfail); 
} 

运行以上函数输出此:

Array 
(
    [0] => Array 
     (
      [0] => main 
     ) 

    [1] => integer 
    [2] => string 
) 

说明:未定义变量:keytest在 线218

警告:call_user_func()预计 参数1是一个有效的回拨,没有 数组或字符串218中给出的字符串

注意:未定义变量:valtest在 线226

警告:call_user_func()预计 参数1是一个有效的回调,管线没有给出 数组或字符串226

哪儿来的$ keytest和$ valtest值去?为什么它们在lambda函数内是空的,即使我将它们声明为全局的?

$fn_vfail=function($v){ 
    global $valtest; 
    return call_user_func($valtest,$v); 
}; 

回答

5

function($v) use ($valtest) { ...