2010-10-12 19 views
11

Yani şöyle bir işlev var:PHP echo çıkışını yakalamak mümkün mü?

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>'; 
    } 
} 

Bu işlev bazı öğeler üzerinde döngüler yapar ve sırasız bir liste oluşturur. Merak ettiğim şey yankı çıktısını yakalamak mümkün olsaydı merak ediyorum.

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

Ben sadece bir değişkene ekoyu değiştirebilir ve değişkeni geri döndürebilirim, ancak bu fonksiyonu değiştirmeden eko çıktısını yakalamanın mümkün olup olmadığını merak ettim, sadece bir şekilde işleve yapılan çağrıyı modifiye ettim mi?

Teşekkürler!

cevap

40

Evet, output buffering'u kullanarak. Benim amaçlar için önceki cevabı ama biraz daha özlü Çok Benzer

<?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 Aynı cevap, 1 dakika önce. – Gazler

+0

Çok ilginç, özlü ve iyi cevap için teşekkürler. :-) – Chris

+0

@Pekka: Benim bir projeye özgü küçük bir MVC çerçevesi için tasarım açısından bu gitmek için iyi bir yol olurdu? Verileri için bir soap web hizmetine dayanan bir uygulamam var ve bu, bağımsız değişkenlerle nesneleri kabul eden ve bu unorderedlist işleviyle gördüğünüz gibi HTML'yi onlara dayalı bir Render sınıfıdır. Düşüncelerinizin ne olduğunu merak ediyorum. Bu çözüme dayanarak indeks.php gibi sayfalar arasında ob_start, ob_end_cleans gibi fonksiyon çağrıları görebiliyorum. Belki yeni bir şey öğrendim ama yine de render oluşturma işlevlerinin statik kütüphanesini yeniden işlemem gerekiyor mu? – Chris

0

:

<?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 
?> 
Ben de ile test günlükleri yığılmayı etmemek için bu PHP birim test için ne kadar yararlı olduğunu belirtmek istiyoruz

Test başarısız olduğunda test ettiğiniz şeyin çıktısı. İşte bununla ilgili başka bir stackflow cevabı çünkü ben ilk e-posta çıkışı ile öğeleri test ederken ben google aramada bu cevabı buldum: How to use output buffering inside PHPUnit test?

İlgili konular