PHP lambda函数和范围

时间:2011-03-23 16:30:00

标签: php php-5.3 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 in   第218行

     

警告:call_user_func()期望   参数1是有效的回调,没有   第218行中给出的数组或字符串

     

注意:未定义的变量:valtest in   第226行

     

警告:call_user_func()期望   参数1是有效的回调,没有   第226行中给出的数组或字符串

$ keytest和$ valtest值在哪里?为什么它们在lambda函数中是空的,即使我像这样声明它们是全局的?

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

这可能与此错误有关:http://bugs.php.net/53958

已在5.3.6中修复了