在看thinkphp源码的时候
访问的控制器方法没有调用display的时候
在Hook::listen中打印出执行的行为
string 'app_init=>' (length=10)
array 0 => string 'Behavior\BuildLiteBehavior' (length=26)
string 'app_begin=>' (length=11)
array 0 => string 'Behavior\ReadHtmlCacheBehavior' (length=30)
string 'app_end=>' (length=9)
array 0 => string 'Behavior\ShowPageTraceBehavior' (length=30)
但是在使用了display之后
string 'app_init=>' (length=10)
array 0 => string 'Behavior\BuildLiteBehavior' (length=26)
string 'app_begin=>' (length=11)
array 0 => string 'Behavior\ReadHtmlCacheBehavior' (length=30)
string 'view_filter=>' (length=13)
array 0 => string 'Behavior\WriteHtmlCacheBehavior' (length=31)
string 'view_parse=>' (length=12)
array 0 => string 'Behavior\ParseTemplateBehavior' (length=30)
string 'template_filter=>' (length=17)
array 0 => string 'Behavior\ContentReplaceBehavior' (length=31)
string 'app_end=>' (length=9)
array 0 => string 'Behavior\ShowPageTraceBehavior' (length=30)
使用了display多出了三个view_filter,view_parse,template_filter
找来找去,display之后的代码的一部分
// 页面缓存
ob_start();
ob_implicit_flush(0);
if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板
$_content = $content;
// 模板阵列变量分解成为独立变量
extract($this->tVar, EXTR_OVERWRITE);
// 直接载入PHP模板
empty($_content)?include $templateFile:eval('?>'.$_content);
}else{
// 视图解析标签
$params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);
Hook::listen('view_parse',$params);
}
// 获取并清空缓存
$content = ob_get_clean();
// 内容过滤标签
Hook::listen('view_filter',$content);
// 输出模板文件
return $content;
Hook::listen('view_parse',$params);明明在Hook::listen('view_filter',$content);上面,但是输出顺序确实反的。。。。真不知道怎么回事
看了下ob函数,觉得大概情况知道了,也不知道是不是对的
先贴下ob函数
一、 相关函数简介:
1、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。
为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$│=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()。
自己所想的tp的效果
<pre name="code" class="php"><?php
header('Content-type:text/html;charset=utf-8;');
ob_start();
echo "我是缓存区内容";
$contents=ob_get_clean();
echo "我是输出内容<br/>";
echo $contents;
echo "我是测试";//因为在程序执行完毕的时候也是会输出缓存区内容的,这里是想试试ob_get_clean会不会返回缓存区内容
?>
正常情况,应该是现输出“我是缓存区内容”再输出“我是输出内容”
但实际是正好相反