PHP - функция, которая возвращает материал, отраженный другими функциями - PullRequest
3 голосов
/ 17 декабря 2010

скажем, у меня есть набор функций, таких как

  • article() - выводит статью
  • menu() - меню

и так далее ...

иногда мне может понадобиться только получить выходные данные таких функций, а не распечатать их на экране.Поэтому вместо создания другого набора функций, которые возвращают значения, такие как get_article(), get_menu() и т. Д., Я мог бы создать одну функцию, которая делает это, используя буферизацию вывода и, например, call_user_func?

.

function get($function_name){
  ob_start();
  call_user_func($function_name);
  return ob_get_contents();
}

проблема в моем коде состоит в том, что я не знаю, как я могу передать аргументы $function_name.Функция может нуждаться в любом количестве аргументов ...

Ответы [ 6 ]

3 голосов
/ 17 декабря 2010

Или вы можете просто изменить article() и menu(), чтобы иметь последний необязательный параметр $return, который является логическим значением по умолчанию false, поэтому, когда $return равно true, вы можете вернуться из того же функция.

article($id, $return = false) 
{
  // ...
  if($return)
  {
    return $article;
  } else {
    echo $article;
  }
}
3 голосов
/ 17 декабря 2010

Вы можете использовать call_user_func_array(), что позволит вам также передавать массив параметров. Однако, вероятно, лучше заставить вашу функцию article() возвращать строку и выводить ее только при необходимости.

3 голосов
/ 17 декабря 2010

Почему бы не создать необязательный аргумент для указания, выводить ли return или echo что-то вроде этого:

function article($output = false)
{
   // your code..........

   if ($output === true){
     echo $result;
   }
   else{
     return $result;
   }
}

Теперь, если вы хотите отобразить что-то из той же функции, вы должны установить $output в true при вызове функции следующим образом:

article(true);

Но если вы хотите просто вернуть результат функции, вы можете вызвать его без указания $output:

article();
2 голосов
/ 17 декабря 2010

Это просто ... Просто извлеките аргументы, используя func_get_args ...

function get($function_name){
    $arguments = func_get_args();
    array_shift($arguments); // We need to remove the first arg ($function_name)
    ob_start();
    call_user_func_array($function_name, $arguments);
    return ob_get_clean();
}

Использование:

function foo($arg1, $arg2) { echo $arg1 . ':' . $arg2; }

$bar = get('foo', 'test', 'ing'); // $bar = 'test:ing'

Обратите внимание на две вещи.

  1. Это игнорирует return вызванной функции.
  2. Я изменил конечную функцию на ob_get_clean(), так как она удаляет созданный буфер.Код, который у вас был, создавал бы новый буфер для каждого вызова, а не удалял его (следовательно, постепенно все замедлялось, так как нужно было выводить весь вывод из большого количества буферов) ...
2 голосов
/ 17 декабря 2010

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

Тогда, если вы хотите повторить, вы просто говорите echo article();

1 голос
/ 17 декабря 2010

Да, это возможно.Вы можете посмотреть здесь .

...