Передача локальной пользовательской функции (пользовательский фильтр) в качестве параметра в метод класса? - PullRequest
0 голосов
/ 28 февраля 2012

Мне интересно, возможно ли это как-то?

пример кода

class CustomFilter {
  ...
  function FilterData($data, $function_name) {
    # here I want to execute that function against $data argument
    }
  ...
  }

function add2($x) {
  return $x + 2;
  }

$fd = new CustomFilter;
$fd->FilterData(5, ‘add2’);

Я могу передать имя функции и выполнить ее, используя eval () вне класса, но внутри класса эта функция не видна.Есть ли способ заставить пользовательскую функцию работать внутри класса?

В чем идея?

Используя конструктор класса, пользователь передает конфигурационный массив в класс.Часть массива может содержать различные параметры фильтра, например:

массив конфигурации

$cfg = array(
  'image' => array(
    'params' => array(
      '+src' => 'string[filter:url]',
      'maxwidth' => 'integer[filter:1+]',
      'byte' => 'integer[filter:0-255]',
      'alt' => 'string',
      'align' => 'string[values:left|right|center]',
      'binary' => false
      ),
    ...
    ),
  ...
  );

Параметры фильтра определяют критерии фильтра для некоторых полей ввода.В этом примере 'string[filter:url]' вызывает некоторый внутренний метод, чтобы проверить, является ли параметр 'src' допустимым параметром url, 'integer[filter:1+]' проверяет, является ли значение целым числом больше 1, 'false' означает «не фильтровать значение».Но одним из возможных значений является 'string[customfilter:myfunction]', что означает «проверить аргумент с помощью пользовательской функции myfunction».

Мне нужно задать имя локальной функции в виде строки и выполнить ее внутри класса.

Есть предложения?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Вы можете вызвать функцию с помощью call_user_func_array() или call_user_func():

function FilterData($data, $function_name) {
  call_user_func($function_name, $data);
}
2 голосов
/ 28 февраля 2012

Вы можете назвать это так:

$function_name($data);

Внутри вашей dataFilter функции.

Пример:

class CustomFilter {
  function FilterData($data, $function_name) {
     $function_name($data);
  }
}

function add2($x) {
  echo $x + 2;
}

$fd = new CustomFilter;
$fd->FilterData(5, 'add2');

Результат:

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