【问题标题】:Possible to capture PHP echo output?可以捕获 PHP 回显输出吗?
【发布时间】:2010-10-12 16:47:23
【问题描述】:

所以我有一个功能,例如:

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 输出,而只需以某种方式修改对该函数的调用?

谢谢!

【问题讨论】:

    标签: php stdout echo


    【解决方案1】:

    是的,使用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
     ?>
    

    【讨论】:

    • 非常有趣,感谢简洁而好的回答。 :-)
    • @Pekka:就我的项目特定的小型 MVC 框架的设计而言,这是一个好方法吗?我有一个应用程序,它的数据依赖于一个肥皂网络服务,这是一个 Render 类,它通过参数接受对象并根据它们呈现 HTML,正如你在这个 unorderedlist 函数中看到的那样。只是好奇你对此有何看法。基于该解决方案,我可以看到像 index.php 这样的页面有很多 ob_start、ob_end_cleans 和函数调用。也许我学到了一些新东西,但仍然需要重新设计渲染函数的静态库?
    • @Pekka:也许我可以让 Render 类的函数都包含 ob_start()、ob_get_contents()、ob_end_clean(),并为此类添加一个公共字段,该字段附加了 ob_get_contents 的结果?这样我可以使用 Render 类构建页面,最后做一个简单的 echo Render::$contentsfield; ?
    • @Chris Mmm,使用输出缓冲作为库的一部分对我来说听起来不是一个好习惯。这更像是你不得不做的事情,例如使用与内容相呼应的外部库时。为什么不改变类方法的行为以返回数据而不是回显它,并使页面本身(调用 Render 类的页面)回显结果?
    • 很公平,根据我在 SE 附近对您的了解,我会全心全意地听取您的建议。 :-) 干杯伙伴。
    【解决方案2】:

    与之前的答案非常相似,但对我来说更简洁:

    <?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 单元测试有多么有用,以免测试日志与您正在测试的输出混淆,除非测试失败。这是另一个与此相关的堆栈流答案,因为当我查看如何使用回显输出测试项目时,我首先在我的谷歌搜索中找到了这个答案:How to use output buffering inside PHPUnit test?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 2021-12-30
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多