Intereting Posts
работают ли сеансы, когда файлы cookie отключены? Оптимизация итерации через массив с использованием foreach-циклов Как вернуть переменную javascript в Ajax? Предел аргументов POST в html или php Предупреждение: Заголовок может содержать не более одного заголовка, обнаружена новая строка Вставка значений в несколько таблиц MySQL сразу Визуальный Composer пользовательский шаблон короткого кода – custom_markup отображение пользовательского ввода Пакетный скрипт для замены коротких открытых тегов PHP <? Php Как настроить работу cron через PHP (не CPanel)? Как развернуть проект symfony без доступа к продукту SSH и CLI gwt-rpc десериализация rpc строка Как сохранить веб-страницу в качестве файла изображения с помощью PHP? Magento – проблема с созданием настраиваемого модуля exec () продолжает выполнение команды Again and Again как бесконечный цикл, несмотря на отсутствие цикла в программе PHP PDO не генерирует исключение при дублировании ключевой вставки

захват эха в переменную

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

$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>";