Я вызываю функции, используя динамические имена функций (что-то вроде этого)
$unsafeFunctionName = $_POST['function_name']; $safeFunctionName = safe($unsafeFunctionName); // custom safe() function
Затем я хочу обернуть некоторый xml вокруг возвращаемого значения функции (что-то вроде этого):
// xml header etc already created $result = "<return_value>" . $safeFunctionName() . "</return_value>";
Проблема в том, что иногда функция возвращает значение, но иногда функция echo является значением. То, что я хочу сделать, это захватить это эхо в переменную, но код, который я пишу, должен работать в любом случае (это означает, что если функция возвращает значение или эхо-строка).
Не совсем уверен, с чего начать какие-либо идеи?
Позвольте мне предисловие к этому, сказав: будьте осторожны с этой пользовательской функцией, вызывающей бизнес. Я предполагаю, что вы знаете, насколько это опасно, поэтому вы его как-то чистите.
Прошлое, что вы хотите, известно как буферизация вывода :
function hello() { print "Hello World"; } ob_start(); hello(); $output = ob_get_clean(); print "--" . $output . "--";
(Я добавил тире, чтобы показать, что он не печатается сначала)
Вышеизложенное выведет –Hello World –
PHP: ob_get_contents
ob_start(); //Start output buffer echo "abc123"; $output = ob_get_contents(); //Grab output ob_end_clean(); //Discard output buffer
Чтобы использовать выходное значение, если оно присутствует, или возвращаемое значение, если нет, вы можете просто изменить свой код следующим образом:
ob_start(); $return_val = $safeFunctionName(); $echo_val = ob_get_clean(); $result = "<return_value>" . (strlen($echo_val) ? $echo_val : $return_val) . "</return_value>";