PHP: ¿Suprimir la salida dentro de una función?


¿Cuál es la forma más sencilla de suprimir cualquier salida que una función pueda producir? Digamos que tengo esto:

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

Y quiero llamar a testFunc() y obtener su valor de retorno sin que aparezca "Testing" en la página. Suponiendo que esto estaría en el contexto de otro código que hace salida de otras cosas, ¿hay un buen método para hacer esto? Tal vez jugando con el búfer de salida?

Author: hakre, 2009-01-28

4 answers

Sí, jugar con el Búfer de salida es exactamente la respuesta. Simplemente enciéndalo antes de llamar a su método que daría salida (no a la función en sí, pero donde la llame, podría envolverlo alrededor de todo su script o el flujo de script, pero puede hacerlo lo más "apretado" posible simplemente envolviéndolo alrededor de la llamada del método):

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

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

Y no se genera ninguna salida.

 54
Author: Cody Caughlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-28 02:47:08

Aquí tienes:

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

"ob" significa "output buffering", echa un vistazo a las páginas de manual aquí: http://www.php.net/outcontrol

 10
Author: Ray Hidayat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-28 01:52:43

Sí, está en el camino correcto en cuanto a aprovechar las funciones de búfer de salida de PHP, es decir, ob_start y ob_end_clean (búsquelas en php.net):

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

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

    echo $output;
?>
 3
Author: George Jempty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-11 12:55:37

¿No es tan fácil como aplicar algunas condiciones a tu código?

Me refiero a si variable = testing entonces salida, de lo contrario no?

Para las funciones que tienen un resultado que sale directamente al navegador como EVAL, puede capturar el resultado en un ob_start.

 0
Author: Stephen Baugh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-28 01:54:26