2010-10-12 20 views
11

Así que tienen una función como:Posible capturar la salida de eco de PHP?

public static function UnorderedList($items, $field, $view = false){ 
    if(count($items) > 0){ 
     echo '<ul>'; 
     foreach($items as $item){ 
      echo '<li>'; 
      if($view){ 
       echo '<a href="'.$view.'id='.$item->sys_id.'" title="View Item">'.$item->$field.'</a>'; 
      }else{ 
       echo $item->$field; 
      } 
      echo '</li>'; 
     } 
     echo '</ul>'; 
    }else{ 
     echo '<p>No Items...</p>'; 
    } 
} 

bucles Esta función sobre algunos artículos y hace una lista desordenada. Lo que me pregunto es si es posible capturar la salida de eco si lo deseo.

hago una llamada para utilizar esta función haciendo algo como:

Render::UnorderedList(Class::getItems(), Class::getFields(), true); 

y esto va a volcar una lista desordenada en mi página. Sé que puedo simplemente cambiar el eco de una variable y devolver la variable, pero tenía curiosidad si es posible capturar la salida de eco sin modificar esa función, simplemente modificando la llamada a la función de alguna manera.

Gracias!

Respuesta

40

Sí, usando output buffering.

<?php 
ob_start(); // Start output buffering 

Render::UnorderedList(Class::getItems(), Class::getFields(), true); 

$list = ob_get_contents(); // Store buffer in variable 

ob_end_clean(); // End buffering and clean up 

echo $list; // will contain the contents 
?> 
+0

+1 La misma respuesta, 1 minuto antes. – Gazler

+0

Muy interesante, gracias por la respuesta concisa y buena. :-) – Chris

+0

@Pekka: En términos de diseño para un pequeño marco MVC específico para un proyecto mío, ¿sería una buena forma de hacerlo? Tengo una aplicación que se basa en un servicio web soap para sus datos y esta es una clase Render que acepta objetos por argumento y representa HTML basado en ellos como lo vio con esta función de lista no ordenada. Solo curiosidad por lo que piensas sobre esto. Sobre la base de esa solución, puedo ver páginas como index.php tener un montón de ob_start, ob_end_cleans con llamadas de función en el medio. Tal vez aprendí algo nuevo, pero aún tengo que volver a trabajar en la biblioteca estática de funciones de renderizado. – Chris

0

muy similar a la respuesta anterior, pero un poco más concisa para mis propósitos:

<?php 
ob_start(); // Start output buffering 

Render::UnorderedList(Class::getItems(), Class::getFields(), true); 

$list = ob_get_clean(); // Store buffer AND cleans it 

echo $list; // will contain the contents 
?> 

También quiero hablar de lo útil que es para las pruebas unitarias PHP a fin de no saturar los registros de prueba con el resultado de lo que está probando a menos que la prueba falle. Aquí hay otra respuesta de stackflow relacionada con esto porque encontré esta respuesta primero en mi búsqueda de Google cuando estaba buscando cómo probar elementos con la salida de eco: How to use output buffering inside PHPUnit test?

Cuestiones relacionadas