PHP использовать различные пользовательские функции внутри другой пользовательской функции

0

Я создал функцию

function do_stuff($text) {
   $new_text = nl2br($text);

   return $new_text;
}

$result = do_stuff("Hello \n World!"); 
//returns "Hello <br /> World!"

Я хочу иметь возможность поставлять еще одну простую встроенную функцию PHP, например strtoupper() внутри моей функции, а не только strtoupper(), которая мне нужна, мне нужно предоставить различные функции в мою функцию do_stuff().

Скажем, я хочу сделать что-то вроде этого.

$result = do_stuff("Hello \n World!", "strtolower()");
//returns "Hello <br /> World!"

Как я могу сделать эту работу без создания другой функции.

function do_stuff($text, $sub_function='') {
   $new_text = nl2br($text);

   $sub_function($new_text);

   return $new_text;
}

$result = do_stuff("Hello \n World!"); 
//returns "Hello <br /> World!"

PS Просто помню переменные переменные и googled, на самом деле есть функции Variable, может ответить на этот вопрос сам.

http://php.net/manual/en/functions.variable-functions.php

  • 0
    Я не понимаю То, что вы спрашиваете, вы достигли во втором примере.
  • 0
    Будет ли работать второй пример? Я просто сделал это случайно. Редактировать вау это работает, я просто забыл присвоить значение подфункции переменной $ new_text :)
Показать ещё 1 комментарий
Теги:
function

4 ответа

1
Лучший ответ

У вас это есть в вашем втором примере. Просто убедитесь, что он существует, а затем назначьте возврат к строке. Здесь есть предположение о том, что функция принимает/требует как args и что она возвращает:

function do_stuff($text, $function='') {
    $new_text = nl2br($text);

    if(function_exists($function)) {
        $new_text = $function($new_text);
    }
    return $new_text;
}

$result = do_stuff("Hello \n World!", "strtoupper"); 
  • 0
    Спасибо, ты был первым. Как передать несколько аргументов в функцию, скажем if $function="str_ireplace"; ?
  • 0
    Завершилось использованием call_user_func_array("function", $args_arr) как он поддерживает несколько аргументов в любом порядке, например, я могу сделать как str_ireplace("find", "", $text) и stristr($text, "find") с ними, имеющими аргументы в другом порядке
1

Callables могут быть строками, массивами с определенным форматом, экземплярами класса Closure созданным с помощью function() {}; -syntax и классы, реализующие __invoke напрямую. Вы можете передать любой из них в свою функцию и вызвать их с помощью $myFunction($params) или call_user_func($myFunction, $params).

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

Имейте в виду, что для вызова typehint требуется php 5. 4+

function yourFunction($text, callable $myFunction) { return $myFunction($text); }

$offset = 5;

echo yourFunction('Hello World', function($text) use($offset) {
    return substr($text, $offset);
});

Результат: http://3v4l.org/CFMrI

Рекомендации по документации читать:

0

Вы можете вызвать такую функцию:

$fcn = "strtoupper";
$fcn();

таким же образом (как вы выяснили сами), вы можете иметь переменные переменные:

$a = "b";
$b = 4;
$$a;    // 4
0

Похоже, что вы почти там, просто нужно оставить круглые скобки во втором параметре:

$result = do_stuff("Hello \n World!", "strtolower");

Затем это должно работать после небольшой очистки:

function do_stuff($text, $sub_function='') {
   $new_text = nl2br($text);

   if ($sub_function) {
      $new_text = $sub_function($new_text);
   }

   return $new_text;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню