PHP传递变量方法的性能差异

时间:2010-05-22 23:46:22

标签: php performance pass-by-reference pass-by-value

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

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

4 个答案:

答案 0 :(得分:3)

根据我的理解,PHP 5按值传递简单数据类型和数组,但是当涉及对象时,它通过引用传递。看起来这是一个你应该注意的行为 - 我假设数组是按值传递的,因此如果不需要复制,大数据可能会导致性能损失。

我已经看到很多反对明确传递引用并允许PHP做它的事情。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

如果你按值传递一个大变量(除了PHP5 +中的对象之外的所有东西的默认值),那么是的,你可以获得性能损失。

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

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

答案 3 :(得分:1)

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

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