【发布时间】:2013-02-08 05:00:12
【问题描述】:
我想知道使用它是否有任何真正的好处......
function getSomeContent() {
ob_start(function($content) {
// ... modify content ...
return $content;
}
// ... output stuff ...
return ob_get_clean();
}
...与此相反...
function getSomeContent() {
ob_start();
// ... output stuff ...
$result = ob_get_clean();
// ... modify content ...
return $result;
}
...?
假设“输出内容”和“修改内容”部分在每种情况下都是相同的。关键是“修改内容”的位置发生了变化,第一种情况是在回调中,第二种情况是“内联”。
两者之间是否存在性能优势?例如,当第一种形式只使用一个时,第二种形式是否会复制两个缓冲区内容?还是纯粹是编码风格决定?为什么你会选择一种形式而不是另一种形式?
我可以看到作用域访问存在差异,因为封闭作用域中的任何变量都将在第二个示例的“修改内容”部分中可用,它们必须使用 use “传入”第一个例子中的子句。事实上,这正是我通常会选择第二种形式的原因。
【问题讨论】:
-
在第一种情况下,你不需要做
$result = ob_get_clean();,你会做ob_end_clean();(在清理之前调用回调)。否则第二种情况是你的。如果您想以这种方式使用第一种情况(修改 2 次结果),您只会增加应用程序的复杂性。 -
谢谢@Ninsuo,但我想你可能没有正确理解我的代码示例(我的问题不够清楚),所以我通过将它们添加到方法中添加了更多上下文具有相同签名的调用。第一种情况不是两次修改结果,我不明白你的意思,你能澄清一下是怎么回事吗?当然,我想使用
ob_get_clean()而不是ob_end_clean(),因为这只会丢弃我想要保留的缓冲区内容。我问的是在ob_start()中使用回调与处理结果“内联”可以这么说。 -
虽然我认为所有这些都只是编码风格的问题(Ninsuo 正确地指出回调风格可以让你的代码更简洁),但你应该重新评估它是否真的有必要回退到使用输出缓冲来捕获输出。你在
ob_start和ob_get_clean之间在做什么?您不能首先将输出附加到变量吗? -
@akirk 老实说,这个问题主要是理论上的,我倾向于同意,但是我确实发现在
ob_start()和ob_get_clean()中包装视图脚本很有用(没有回调!)然后视图脚本可以使用标准输出函数(echo等),我以后仍然可以操作输出。至于回调,我很难看到我会使用它们。
标签: php performance coding-style output-buffering