与简单的'return'相比,'ob_get_clean()'返回内容有什么好处?虽然'doSomething()'将以不同的方式工作'返回或回声'。使用一种方法比另一种方法有什么好处。
例如
ob_start();
$this->doSomething();
ob_get_clean();
---与---
相比return $this->doSomething();
答案 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
使用echo
,print_r
,?> … <?php
,fpassthrough
等功能,您需要使用输出缓冲区,以便能够捕获它。如果没有,并返回字符串,只需返回。
关于输出缓冲的示例:
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
返回一个字符串,因此需要将其保存到变量中才有用。