PHP: подавить вывод внутри функции?

Каков самый простой способ подавить любой вывод, который может производить функция? Скажем, у меня есть это:

function testFunc() {
    echo 'Testing';
    return true;
}

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


person Wilco    schedule 28.01.2009    source источник


Ответы (4)


Да, возиться с выходным буфером — это именно то, что нужно. Просто включите его, прежде чем вызывать свой метод, который будет выводить (не саму функцию, а то место, где вы ее вызываете, вы можете обернуть ее вокруг всего скрипта или потока скрипта, но вы можете сделать его максимально «плотным», просто оборачивая его вокруг вызова метода):

function foo() {
  echo "Flush!";
  return true;
}

ob_start();
$a = foo();
ob_end_clean();

И вывод не генерируется.

person Cody Caughlan    schedule 28.01.2009
comment
Мне любопытно, что произойдет в этом случае, если вы уже запустили выходной буфер ранее в своем коде? Будет ли PHP запускать новый буфер для этой функции, а затем завершать только этот буфер, или это приведет к очистке всего ранее буферизованного вывода? - person Wally Lawless; 17.04.2009
comment
Power-coder: PHP запустит новый буфер, а вызов ob_end_clean() завершит только самый последний буфер. us.php.net/manual/en/function.ob- конец-clean.php - person Jay; 02.10.2009
comment
благодаря. Я заново изобретал колесо, написав свою собственную функцию, которая заменяет ECHO и отключает на основе некоторого логического флага ... и я нашел это. - person DhruvPathak; 28.03.2011

Ну вот:

ob_start();
testFunc();
ob_end_clean();

«ob» означает «буферизация вывода», взгляните на справочные страницы здесь: http://www.php.net/outcontrol

person Ray Hidayat    schedule 28.01.2009

Да, вы на правильном пути в отношении использования функций буферизации вывода PHP, то есть ob_start и ob_end_clean (поищите их на php.net):

<?php
  function testFunc() {
    echo 'Testing';
    return true;
  }

    ob_start();
    $output = testFunc();
    ob_end_clean();

    echo $output;
?>
person Dexygen    schedule 28.01.2009

Разве это не так просто, как применить некоторые условия к вашему коду?

Я имею в виду, если переменная = тестирование, то вывод, иначе нет?

Для функций, результат которых выводится прямо в браузер, например EVAL, вы можете зафиксировать результат в файле ob_start.

person Stephen Baugh    schedule 28.01.2009
comment
В случае выполнения этого в целях тестирования, если эхо-операторы не важны, я бы сказал, что лучше использовать выходной буфер. Таким образом, вы можете избежать ненужной логики в своем коде. - person unflores; 05.06.2013
comment
да, и я использовал его, но он запутывает код тестовыми конструкциями. . . - person Dennis; 18.12.2014