2010-10-12 11 views
11

quindi ho una funzione come:È possibile acquisire l'output dell'eco 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>'; 
    } 
} 

Questa funzione loop su alcuni oggetti e rende una lista non ordinata. Quello che mi chiedo è se è possibile catturare l'uscita dell'eco, se lo desidero.

ho effettuare una chiamata a utilizzare questa funzione facendo qualcosa di simile:

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

E questo sarà il dump di un lista non ordinata sulla mia pagina. So che posso semplicemente cambiare eco ad una variabile e restituire la variabile ma ero solo curioso di sapere se è possibile catturare l'output dell'eco senza modificare quella funzione, semplicemente modificando la chiamata alla funzione in qualche modo?

Grazie!

risposta

40

Sì, utilizzando 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 Stessa risposta, 1 minuto prima. – Gazler

+0

Molto interessante, grazie per la risposta concisa e buona. :-) – Chris

+0

@Pekka: In termini di design per un piccolo framework MVC specifico per un mio progetto, questo sarebbe un buon modo per andare? Ho un'applicazione che si basa su un servizio web di sapone per i suoi dati e questa è una classe Render che accetta oggetti per argomento e rende HTML basato su di essi come hai visto con questa funzione non ordinata. Solo curioso di sapere cosa ne pensi. Basandomi su questa soluzione, vedo pagine come index.php che hanno un sacco di ob_start, ob_end_cleans con chiamate di funzione intermedie. Forse ho imparato qualcosa di nuovo, ma ho ancora bisogno di rielaborare la libreria statica delle funzioni di rendering? – Chris

0

molto simile alla precedente risposta, ma un po 'più conciso per i miei scopi:

<?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 
?> 

Voglio anche parlare di quanto sia utile questo è per unit testing PHP in modo da non ingombrare il vostro log di test con l'output di ciò che si sta testando a meno che il test non abbia esito positivo. Ecco un'altra risposta stackflow correlata a questo perché ho trovato questa risposta prima sulla mia ricerca di Google quando stavo osservando come testare gli elementi con output echo: How to use output buffering inside PHPUnit test?

Problemi correlati