用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8663|回复: 11
收起左侧

[控制器] 关于控制器中的_output()函数

  [复制链接]
发表于 2010-11-18 22:25:54 | 显示全部楼层 |阅读模式
今天在看手册的时候看到关于处理输出的时候手册中给了_output()这么一个方法:
处理输出

CodeIgniter 拥有一个输出类用来确保你修改的数据会自动被传递给浏览器。关于这个的更多信息可以在视图和输出类里找到。有些时候,你可能想要自己发布修改一些最终的数据或是自己把它传递给浏览器。CodeIgniter 允许你给你的控制器增加一个名为 _output() 的方法来接收最终的数据。

注意: 如果你的控制器包含一个 _output() 方法,那么它将总是被调用,而不是直接输出最终的数据。这个方法类似于OO里的析构函数,不管你调用任何方法这个方法总是会被执行。

例如:

function _output()
{
    echo 'I am here';
}

请注意,你的 _output() 将接收最终的数据。 Benchmark and memory usage data will be rendered, cache files written (if you have caching enabled), and headers will be sent (if you use that feature) before it is handed off to the _output() function. If you are using this feature the page execution timer and memory usage stats might not be perfectly accurate since they will not take into acccount any further processing you do. For an alternate way to control output before any of the final processing is done, please see the available methods in the Output Class.

不太理解这个接受最终的数据是什么意思,上网查了,有人说:“_output() 方法:类中任意函数的输出结果都会交给此函数处理后再交给客户浏览器 ”,可是还是不能理解,这个输出结果都交给此函数处理是怎么个处理法,是说任意函数的输出无法直接输出到页面,得先经过_output()处理之后才可以还是什么?可是我不知道怎么使用这个函数,想请会的大哥大姐们指点一下,谢谢了
发表于 2010-11-19 18:44:53 | 显示全部楼层
具体怎么处理是你说的算的,例如你要在所有的输出内容中替换一段内容,应该如下写法:
PHP复制代码
 
function _output($output) {
                $noticefooter = <<<EOT
<br />
<h3>说明</h3>
<b>cron 任务执行时间</b>: 完全类似于linux的crontab格式,但只处理 分 和 小时两部分. 如:    <br />
*/2 *  表示每2分钟执行一次 <br />
5 3,4 表示3时5分 和 4时5分执行 <br />
<b>只执行一次的任务</b>:cron留空,nextrun填写希望执行时间。等待时间到了执行完成后,会自动将status改为-1
EOT
;
                $output = str_replace('<!--noticefooter-->', $noticefooter, $output);
            echo $output;
}
 
复制代码
发表于 2010-11-19 19:29:07 | 显示全部楼层
对,这个是为你提供了一个灵活性而已,你不用可以当他不存在。

楼上的回答完全正确,呵呵
发表于 2011-1-29 10:36:21 | 显示全部楼层
析构析构
发表于 2011-2-10 17:08:30 | 显示全部楼层
原来有点像spring里的MethodInterceptor
发表于 2011-6-23 17:26:32 | 显示全部楼层
存在即合理,我就不明白,为什么可以当他不存在。难道它的出现只是叫你好玩~~~~~求解中。
发表于 2011-6-23 20:00:23 | 显示全部楼层
譬如要生成静态页的时候
发表于 2011-12-25 14:23:00 | 显示全部楼层
发表于 2012-1-6 16:29:12 | 显示全部楼层
这个我也不太理解呢
发表于 2012-1-6 20:15:07 | 显示全部楼层
请注意,你的 _output() 将接收最终的数据。

这句翻译错了!

原句是:
Please note that your _output() function will receive the data in its finalized state.

应译为

请注意,你的 _output()函数接收到的是最终状态的数据。

简单说,output class在送出数据之前一刻,会先去看看控制器有无_output()这函数,有!便送到_output(),控制器再决定如何处理。

PHP复制代码
 
function _output($output)
{
    echo $output;
}
 
复制代码

是说,控制器在_output()函数中再echo出来,控制器亦可在_output()再进行post-processing,但post-processing的表现数据并无算到“最终状态的数据”內,_output()花费了多少,CI没有算。

“最终状态的数据”的意思是指CI当它已是完全处理好,要发送到浏览器去的数据。Post-processing是指在“最终状态”之后再进行处理。

若控制器没有_output()这函数,output class便按原定,输出浏览器去,不会去呼叫_output()。


这个方法类似于OO里的析构函数,不管你调用任何方法这个方法总是会被执行。

这在原文并不存在,是谁自行加上的?

_output()应算是类似hooks,有便呼叫执行,无便跳过。析构函数(destructor)是必须执行的,但_output()函数并非如此。

本版积分规则