0

将数据作为值而不是作为 PHP 中的引用传递时,会有任何可测量的性能差异吗?

似乎很少有人知道变量可以作为值而不是引用传递。这是常识还是不是?

4

4 回答 4

3

根据我的理解,PHP 5 通过值传递简单的数据类型和数组,但是当涉及到对象时,它通过引用传递。似乎这是您应该注意的一种行为 - 我假设数组是按值传递的,因此如果您不需要制作副本,那么大的数组很可能会导致性能下降。

我已经看到很多反对明确地通过引用传递并让 PHP 做它的事情的论据。

此外,如果你想通过值传递一个对象,那么你应该克隆它,理想情况下。

于 2010-05-23T00:13:33.343 回答
1

如果存在性能差异,则可以忽略不计。不要担心这些微优化,除非您知道通过引用传递会导致性能下降(除非我无法想象这是真的情况)。

另一方面,人们通常建议不要通过引用传递参数,因为它鼓励糟糕的设计,就像使用全局变量一样。

不过,我不确定你说的最后一部分是什么意思。PHP 默认按值传递参数。

于 2010-05-22T23:48:54.013 回答
1

如果您通过值传递一个大变量(这是 PHP5+ 中除对象之外的所有内容的默认值),那么是的,您可能会受到性能影响。

例如,如果用户提交了大量的 POST 数据,如果您要正常将其传递给函数(也称为按值传递),则必须复制整个数组,这会影响性能。但是,除非您在一个非常大型的站点上,否则您可能不会注意到该点击。

在 PHP 中通过引用传递是可能的,但肯定不是默认的(除非它是一个对象):您需要在变量之前添加一个 & 以使其通过引用传递,否则它只是按值传递(并复制它)。自 PHP5 起,对象自动通过引用传递,但在 PHP5 之前,您需要显式通过引用传递(即添加 &)

于 2010-05-23T00:02:06.337 回答
1

如果您使用最新版本的 PHP,则始终通过引用传递对象。作为另一种类型,主要关注的是字符串/数组。对于那些这取决于。PHP 的字符串实现使得如果您不修改传递给函数参数的字符串(您只读取/扫描它),它将永远不会被复制。该实现称为“写时复制”。我不确定数组,我需要一些测试来回答这个问题。

除非你修改了按值传递的字符串参数,否则与按引用传递没有区别。

于 2010-05-23T00:14:38.643 回答