代码之家  ›  专栏  ›  技术社区  ›  Chris

是否可以捕获php echo输出?

  •  14
  • Chris  · 技术社区  · 14 年前

    所以我有一个函数,比如:

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

    此函数循环某些项并呈现无序列表。我想知道的是,如果我愿意,是否可以捕捉回声输出。

    我通过执行以下操作来调用此函数:

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

    这会把一个无序的列表放到我的页面上。我知道我可以将echo改为变量并返回变量,但是我很好奇是否可以在不修改该函数的情况下捕获echo输出,而只是以某种方式修改对函数的调用?

    谢谢!

    2 回复  |  直到 7 年前
        1
  •  45
  •   Pekka    14 年前

    是的,使用 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
     ?>
    
        2
  •  1
  •   Kevin_Ankiewicz    7 年前

    与之前的答案非常相似,但就我的目的而言,稍微简洁一点:

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

    我还想说明这对PHP单元测试有多大的帮助,以便在测试失败之前不要将测试日志与正在测试的内容的输出混淆起来。下面是另一个与此相关的StackFlow答案,因为当我查看如何使用Echo输出测试项目时,我首先在我的Google搜索中找到了这个答案: How to use output buffering inside PHPUnit test?