我注意到很多框架/博客引擎/等等。使用ob_start生成它们的输出,并且在调用extract
之前调用要传递给模板的变量ob_start
。
我猜测缓冲输出可以访问使用extract
创建的任何变量,但我找不到任何特定的文档。
Codeigniter的示例(为简洁起见,从原始代码中删除了一些注释):
extract($this->_ci_cached_vars);
ob_start();
// If the PHP installation does not support short tags we'll
// do a little string replacement, changing the short tags
// to standard PHP echo statements.
if ( ! is_php('5.4') && (bool) @ini_get('short_open_tag') === FALSE && config_item('rewrite_short_tags') == TRUE)
{
echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
}
else
{
include($_ci_path); // include() vs include_once() allows for multiple views with the same name
}
因此,这基本上是提取一组作为数组传入的变量,然后使用ob_start
缓冲一些输出(基本上只是一个包含输出特定视图)。在大多数情况下,包含的视图/模板引用了在ob_start之前提取的变量。
这是ob_start的工作原理吗?它是否可以访问在其使用范围内声明的变量?如果我在ob_start之前声明$test = "hello"
,我是否可以在视图中使用$ start并输出“hello”?