3

我最近查看了 CodeIgniter 的代码,只是想看看它是如何工作的。

我不明白的一件事是为什么 CodeIgniter 将视图生成的所有输出存储在一个变量中并在脚本末尾输出?

这是来自 ./system/core/Loader.php 第 870 行CI 源代码 @ GitHub的一段代码

/*
* Flush the buffer... or buff the flusher?
*
* In order to permit views to be nested within
* other views, we need to flush the content back out whenever
* we are beyond the first level of output buffering so that
* it can be seen and included properly by the first included
* template and any subsequent ones. Oy!
*/
if (ob_get_level() > $this->_ci_ob_level + 1)
{
    ob_end_flush();
}
else
{
    $_ci_CI->output->append_output(ob_get_contents());
    @ob_end_clean();
}

函数 append_output 将给定的字符串附加到 CI_Output 类中的变量。
这样做有什么特殊原因而不使用 echo 语句还是只是个人喜好?

4

2 回答 2

6

有几个原因。原因是您可以加载视图并将其返回而不是直接输出:

// Don't print the output, store it in $content
$content = $this->load->view('email-message', array('name' => 'Pockata'), TRUE);
// Email the $content, parse it again, whatever

第三个参数TRUE缓冲输出,因此结果不会打印到屏幕上。没有你必须自己缓冲它:

ob_start();
$this->load->view('email-message', array('name' => 'Pockata'));
$content = ob_get_clean();

另一个原因是您在发送输出后无法设置标题,因此例如您可以 user $this->output->set_content($content),然后在某些时候设置标题(设置内容类型标题,启动会话,重定向页面等)然后实际显示(或不显示)内容。

一般来说,我发现使用任何类或函数是非常糟糕的形式,echo或者print(例如,在 Wordpress 中很常见)。出于与上述相同的原因,我几乎总是宁愿使用它而echo $class->method();不是让它回显,例如能够将内容分配给变量而不会直接溢出到输出中或创建我自己的输出缓冲区。

于 2012-05-22T19:13:33.297 回答
4

答案在您帖子的评论中。

/**
* In order to permit views to be nested within
* other views, we need to flush the content back out whenever
* we are beyond the first level of output buffering so that
* it can be seen and included properly by the first included
* template and any subsequent ones. Oy!
*/

这样你就可以去:

$view = $this->load->view('myview', array('keys' => 'value'), true);
$this->load->view('myotherview', array('data' => $view));
于 2012-05-22T19:12:58.303 回答