Сначала я покажу функцию:
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 для элегантного решения вашего запроса.