Функция ниже принимает массив и проверяет, соответствуют ли его ключи и значения указанным типам данных.
Кажется, у меня проблемы с внутренними лямбда-функциями, которые раньше работали. Я запускаю 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? Почему они опущены внутри лямбда-функций, даже если я объявляю их глобальными?
$fn_vfail=function($v){ global $valtest; return call_user_func($valtest,$v); };
function($v) use ($valtest) { ...
Вероятно, это связано с этой ошибкой: http://bugs.php.net/53958
Это было исправлено в 5.3.6