Я создал функцию
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, может ответить на этот вопрос сам.
У вас это есть в вашем втором примере. Просто убедитесь, что он существует, а затем назначьте возврат к строке. Здесь есть предположение о том, что функция принимает/требует как 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");
$function="str_ireplace";
?
call_user_func_array("function", $args_arr)
как он поддерживает несколько аргументов в любом порядке, например, я могу сделать как str_ireplace("find", "", $text)
и stristr($text, "find")
с ними, имеющими аргументы в другом порядке
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
Рекомендации по документации читать:
Вы можете вызвать такую функцию:
$fcn = "strtoupper";
$fcn();
таким же образом (как вы выяснили сами), вы можете иметь переменные переменные:
$a = "b";
$b = 4;
$$a; // 4
Похоже, что вы почти там, просто нужно оставить круглые скобки во втором параметре:
$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;
}