在PHP中 - 与'return'相比,'ob_get_clean()'返回内容的好处是什么?

时间:2013-12-09 18:18:41

标签: php

与简单的'return'相比,'ob_get_clean()'返回内容有什么好处?虽然'doSomething()'将以不同的方式工作'返回或回声'。使用一种方法比另一种方法有什么好处。

例如

ob_start();
$this->doSomething();
ob_get_clean();

---与---

相比
return $this->doSomething();

4 个答案:

答案 0 :(得分:10)

他们是完全不同的两件事。

return 从函数返回值。

ob_get_clean返回自ob_start()调用后进入输出缓冲区的字符串(在此特定示例中,您从未将此函数的输出设置为任何内容,因此你的代码应该什么也不做。)

使用return

function foo() {
    return 'abc';
}

echo foo();

使用ob_get_clean(请注意,我们echo代替return在函数内部:

function foo() {
    echo 'abc';
}

ob_start();
foo();
echo ob_get_clean();

除非您需要,否则不要使用输出缓冲区。

答案 1 :(得分:6)

作为一个例子,Wordpress有两组函数可用于为基于WP的站点生成输出相关的大多数内容。将foo()生成一些内容并输出。然后是生成相同内容的getfoo()版本,但返回它而不是输出。

实际上,完全复制函数中的所有代码并且只更改一行是不好的做法:

function foo() {
   ...do lots of stuff
   echo $generated_content;
}
function getfoo() {
   ...do exactly the same stuff
   return $generated_content;  // the only line that'd be different
}

而不是大量的代码重复,你可以简单地拥有

function getfoo() {
   ... do lots of stuff
  return $generated_content;
}

function foo() {
    echo getfoo();  // call getfoo() and output it automatically
}

或者走另一条路:

function foo() {
   ... do lots of stuff
   echo $generated_content;
}
function getfoo() {
   ob_start();
   foo();
   return ob_end_clean();
}

两个版本都会完成同样的事情,但是在不同版本中完成。只需获取其“堂兄”函数的返回值,然后输出即可。另一个工作在另一个方向,捕获表兄弟函数的输出,并返回捕获的数据。

答案 2 :(得分:3)

简单return "string"要快得多,但只有当调用函数将字符串返回时才有可能。所以,这取决于$this->doSomething()的作用。

如果doSomething使用echoprint_r?> … <?phpfpassthrough等功能,您需要使用输出缓冲区,以便能够捕获它。如果没有,并返回字符串,只需返回。


关于输出缓冲的示例:

function yours_echoing() {
    echo "Hello, World!\n";
}

function mine() {
    ob_start();
    yours_echoing();
    return ob_get_clean();
}

对战:

function yours_returning() {
    return "Hello, World!\n";
}

function mine() {
    return yours_returning();
}

选择哪一个完全取决于我所称的功能(“你的”)。

输出缓冲速度更快完全不同:在整个程序范围内,没有进行ob_get_clean()舞蹈,它可以改善页面传输时间(从网络服务器到网络浏览器)通过一次传输(并且可能是压缩的)而不是块来传输所有内容。但这是一个不同的输出缓冲,而不是这里采用的技术,它捕获另一个函数的输出。

答案 3 :(得分:1)

这两个例子完全不同。他们完全没有相似之处。

哪个“更好”?这完全取决于$this->doSomething();的作用。它实际上有返回值吗?它是echo到屏幕上吗?


return $this->doSomething();

这会运行doSomething(),然后返回它返回的内容。就是这样。

另一方面,另一个例子是:

ob_start();
$this->doSomething();
ob_get_clean();

这样做可以捕获doSomething()在输出缓冲区中打印到屏幕上的任何内容(使用echo或类似内容)。然后它将缓冲区作为字符串并立即丢弃它。

ob_get_clean返回一个字符串,因此需要将其保存到变量中才有用。