2009-04-22 2 views
19

Я звоню функции с использованием динамических имен функций (что-то вроде этого)захвата эхо в переменную

$unsafeFunctionName = $_POST['function_name']; 
$safeFunctionName = safe($unsafeFunctionName); // custom safe() function 

Тогда я хотел, чтобы обернуть некоторые XML вокруг возвращаемого значения функции (что-то вроде этого):

// xml header etc already created 
$result = "<return_value>" . $safeFunctionName() . "</return_value>"; 

Проблема в том, что функция иногда возвращает значение, но иногда функция echo является значением. То, что я хочу сделать, это захватить это эхо в переменную, но код, который я пишу, должен работать в любом случае (это означает, что если функция возвращает значение или эхо-строка).

Не совсем уверен, с чего начать ~ любые идеи?

ответ

52

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

Прошлое, что, что вы хотите, известен как output buffering:

function hello() { 
    print "Hello World"; 
} 
ob_start(); 
hello(); 
$output = ob_get_clean(); 
print "--" . $output . "--"; 

(я добавил черточки, чтобы показать, что это не печатается на первой) выход

выше будет --Hello World--

+0

Как вы знаете, метод ob_get_clean? –

+0

Либо все будет хорошо работать, нет? –

+0

отлично - спасибо! – OneNerd

8

PHP: ob_get_contents

ob_start(); //Start output buffer 
echo "abc123"; 
$output = ob_get_contents(); //Grab output 
ob_end_clean(); //Discard output buffer 
0

для того, чтобы использовать е место e, если оно присутствует, или возвращаемое значение, если нет, вы можете просто изменить свой код следующим образом:

ob_start(); 
$return_val = $safeFunctionName(); 
$echo_val = ob_get_clean(); 
$result = "<return_value>" . (strlen($echo_val) ? $echo_val : $return_val) . "</return_value>"; 
Смежные вопросы