2011-03-10 38 views
1

可以将标题的输出延迟到浏览器,直到整个php脚本执行完毕为止?一旦代码的第一片被从PHP发送到web服务器PHP会延迟标题的输出,直到整个PHP脚本运行完毕?

+0

的可能重复的[什么是输出缓冲?](http://stackoverflow.com/questions/2832010/what-is-output-buffering) – Jon 2011-03-10 16:27:24

+0

http://php.net/manual/ EN/function.ob-start.php – kjy112 2011-03-10 16:27:56

+4

@乔恩:**这是不是重复**输出缓冲是答案肯定的,但这些都是**两个完全不同的问题**。 – 2011-03-10 16:31:26

回答

3

标头将被发送。

所以,你可以只是“不回什么”,直到脚本结束或use output buffering来达到同样的事情

1

这是最专业的程序员会建议的方式,原因你应该总是做这样的您可以有效地管理错误和错误页面。

如果您的应用程序已经建成的脚本执行的话,我会建议你从头开始显示输出。

我通常管理输出的方式是用小模板的系统,模板的系统没有解析模板等,它只是需要传递一组数据,然后包括所需的模板。

你应该创建一个以$template->set(key[,value = true])形式表示数据的类,然后显示一个函数,例如$template->display(filename),当此函数执行时,应该提取变量并包含模板文件,在完成之后然后致电exit(0),以免执行进一步的代码。

一个简单的模板系统可以像这样:

class Template 
{ 
    private $_data = array(); 

    public function set($key,$value = true) 
    { 
     $this->_data[$key] = $value; 
    } 

    public function display($template) 
    { 
     //Check template exuists 
     extract($this->_data); 
     require_once $template; 
     exit(0); 
    } 
} 

然后用很简单的,像这样:

$template = new Template(); 
$template->set("title","Practical home Page"); 
$template->set("header","My Home Page"); 

$lists = array(
    array(
     "value" => "list item 1", 
     "id" => "list_item_1", 
     "class" => "item" 
    ), 
    array(
     "value" => "list item 2", 
     "id" => "list_item_2", 
     "class" => "item" 
    ) 
); 

$template->set("menu",$lists); 
$template->display("templates/homepage.php"); 

你也可以想阅读下面的答案,我以前回答!

PHP Looping Template Engine - From Scratch

+0

-1:为什么?无论如何,这正是Zend Engine处理标题的方式。可以使用['标题()'](http://php.net/header),['headers_list()'](http://php.net/headers_list),和['header_remove()']( http://php.net/header_remove)随时可以使用标题。你的方法只会增加一层复杂性,如果你忘记了一步就会在后面咬你......我很抱歉,但是“专业程序员”不会因为它而增加复杂性。 – 2011-03-10 16:53:30

+2

这不是复杂而是结构和组织,它不是为了它的缘故,它帮助管理逻辑和观点的分离。使用ob_start不会捕获已发送的头文件,使用ob_start可以捕获输出,如果在输出中发送了几个头文件,那么这违背了应用程序体系结构的标准。查看!=逻辑 – RobertPitt 2011-03-10 17:03:18