Сначала я покажу функцию:
function validate($data, $filter){
if(!filter_var($data, $filter))
{
return 'Filter used:'.$filter;
}
else
{
return 'good';
}
}
Когда я буду использовать эту функцию, она будет выглядеть так:
$email = '[email protected]';
echo validate($email, FILTER_VALIDATE_EMAIL);
Выход:
Используемый фильтр: 274
Проблема в том, что я хочу, чтобы результат был:
Используемый фильтр: FILTER_VALIDATE_EMAIL.
Чтобы получить фактическое имя константы, вам, вероятно, нужно передать фильтр в виде строки и использовать constant()
:
function validate($data, $filter){
if(!filter_var($data, constant($filter)))
{
return 'Filter used:'.$filter;
}
else
{
return 'good';
}
}
Затем используйте его так:
echo validate($email, 'FILTER_VALIDATE_EMAIL');
Я подумал о нескольких флагах, и мне было скучно. Это может стать действительно грязным, но для простых фильтров он работает:
function validate(){
$args = func_get_args();
$data = array_shift($args);
$con_args = array_map('constant', $args);
array_unshift($con_args, $data);
if(!call_user_func_array('filter_var', $con_args))
{
return 'Filter used:'.implode(', ', $args);
}
else
{
return 'good';
}
}
echo validate($url, 'FILTER_VALIDATE_URL', 'FILTER_FLAG_PATH_REQUIRED');
FILTER_VALIDATE_EMAIL
- это именованная константа, которая установлена в 274
. Функция validate()
никогда не видит "FILTER_VALIDATE_EMAIL", она просто видит 274
в нее и передает 274
в filter_var()
, которая знает, как ее обрабатывать.
Одним из преимуществ констант для разработчика является: с помощью IDE с автозаполнением и интеллектом кода вы можете быть уверены в имени переменной и, таким образом, избегать возможных опечаток.
Посмотрите на ответ @AbraCadaver за элегантное решение вашего запроса.