PHP лямбда-функции и область видимости - PullRequest
2 голосов
/ 23 марта 2011

Следующая функция берет массив и проверяет, соответствуют ли его ключи и значения указанным типам данных.

Кажется, у меня есть некоторые проблемы с внутренними лямбда-функциями, которые ранее работали. Я использую 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 в линия 226

Предупреждение: call_user_func () ожидает параметр 1, чтобы быть действительным обратным вызовом, нет массив или строка в строке 226

Куда делись значения $ keytest и $ valtest? Почему они пусты внутри лямбда-функций, даже если я объявляю их глобальными, как это?

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

Ответы [ 2 ]

6 голосов
/ 23 марта 2011

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

1 голос
/ 23 марта 2011

Это, вероятно, связано с этой ошибкой: http://bugs.php.net/53958

, которая была исправлена ​​в 5.3.6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...