我正在尝试阅读CI 2的源代码,我对此感到困惑 在查看核心/ Loader类的方法:
/*
* 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();
}
我无法理解这个片段,
第一: 代码注释表示它适用于嵌套视图,但我认为它将在以下情况下刷新:
...
$this->load->view('section_a');
$this->load->view('section_b');
...
每次运行view方法时,都会打开一个缓冲区,所以如果我们加载两个视图,即使它们没有嵌套,第一个视图也会被刷新,是吗?
第二:为什么我们需要立即冲洗最早的缓冲区?
由于它们最终会自动刷新,实际上我发现没有' ob_end_flush'在最终的渲染方法中,输出 - > _display(),这意味着CI仍然依赖于自动刷新功能,对吗?
第三:为什么条件是当前ob级别大于默认级别+1?
如果我加载两个视图,第二个视图将触发刷新,对吧?
第四:如果在此处手动刷新视图,是否仍会通过输出> _display()进行调整?
我尽力说清楚,我希望你能帮助我。谢谢。
答案 0 :(得分:1)
每次运行view方法时,都会打开一个缓冲区,如果是的话 加载两个视图,即使它们没有嵌套,第一个视图也是如此 脸红了,是吗?
没有。只有在加载一个视图文件时才会发生另一个调用$this->load->view()
的情况。
连续调用时,如示例所示,每个都将在加载时附加到输出类。
第二:为什么我们需要立即冲洗最早的缓冲液?
刷新它的最早的缓冲区是当前缓冲区并且它被刷新到先前的缓冲区中。输出缓冲区是堆叠的,而不是并行的。
第三:为什么条件是当前的ob级别大于默认级别+1?
我认为已经回答了。在ob_get_level() > $this->_ci_ob_level + 1
时,我们会尝试在当前加载的视图中再次调用load->view()
。
第四:如果在这里手动刷新视图,是否仍然可以通过Output-> _display()进行调整?
"在这里"?但我认为答案是肯定的。