何时在 PHP 中通过引用传递

Posted

技术标签:

【中文标题】何时在 PHP 中通过引用传递【英文标题】:When to pass-by-reference in PHP 【发布时间】:2011-01-10 14:19:43 【问题描述】:

我想知道当你只读取一个变量时传递引用是否是一种好习惯,或者它是否应该始终作为一个值传递。

引用传递示例:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function &do_my_hash(&$value)
   return md5($value);

传值示例:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function do_my_hash($value)
   return md5($value);

哪个更好?例如,如果我要运行 1000 轮循环?

循环示例:

for($i = 0 ; $i < 1000 ; $i++)
   $a = 'Fish & Chips '.$i;
   echo do_my_hash($a);

【问题讨论】:

【参考方案1】:

如果你的意思是传递一个 (所以函数不会修改它),没有理由通过引用传递它:它只会让你的代码更难理解,因为人们会认为“这个函数可以修改我将传递给它的内容——哦,它不会修改它?

在您提供的示例中,您的 do_my_hash 函数不会修改您传递给它的 ;所以,我不会使用参考。

如果您担心性能,您应该阅读这篇最近的博文:Do not use php references:

人们使用引用的另一个原因是 因为他们认为它使代码 快点。但这是错误的。甚至是 更糟糕的是:引用主要是编写代码 慢点!是的,参考经常使 代码变慢了 - 抱歉,我只需要 重复此操作以使其清楚。

实际上,这篇文章可能会很有趣,即使您主要关心的不是性能 ;-)

【讨论】:

我在考虑效率。由于该函数没有更改参数,因此通过引用传递会更好,因为它不需要复制值。如果 $a="bla bla bla... [带有 10.000 个字符的文本...]"; ... 10.000 个字符会占用大量内存,因此不要复制它,而是通过引用发送它... 我会非常谨慎地使用它,并且仅当您打算返回与您传入的值相似的值时。创建某事物的 md5 哈希会完全改变它,因此您不会想要通过引用传递。 在这种情况下,我链接到的文章是您应该阅读的内容 ;-) ;;当然是我引用的那句话——在(我没有引用)之后有解释;; PHP 不是 C,例如 ^^【参考方案2】:

PHP 尽可能多地使用写时复制(只要它通常会提高性能),因此使用引用不会给您带来任何性能优势;它只会伤害。仅在您真正需要它们时才使用它们。来自 PHP 手册:

不要使用按引用返回来提高性能。引擎会自行自动优化。仅在您有正当的技术理由时才返回参考资料。

【讨论】:

愿意提供您引用的参考文献的 URL 吗?谢谢! php.net/manual/en/language.references.return.php【参考方案3】:

良好的编程习惯是尽可能按值传递,如果必须修改单个值,通常最好将修改后的值作为函数的结果返回,而不是通过引用传递值。

您可能需要通过引用传递的唯一情况是您需要修改多个值。然而,这些情况往往很少见,通常应该被视为检查代码的标志,因为可能有更好的方法来解决问题。

过去,早期的编程语言总是通过引用传递,而通过值传递是后来的发展,以解决由此产生的问题(您往往会遇到一些晦涩难懂的错误,因为迟早会有程序员将代码放入在某个函数或其他函数中修改通过引用传递的值,然后确定在哪里并正确修复是很棘手的——你往往会得到多个、模糊的依赖项)。因此,当我们是多代处理器时,如果它被认为是 CPU 与复杂性之间的良好权衡以帮助清洁、可维护、代码。

【讨论】:

【参考方案4】:

微优化的乐趣。 :-)

老实说,通过引用传递“正常”变量可能并没有什么好处(除非您想影响它们在原始范围内的值)。此外,由于 PHP 5 对象是通过引用自动传递的。

【讨论】:

【参考方案5】:

如果您不想在函数内修改该值,则通过引用传递没有任何好处。我尽量使用 pass-by-value,因为它更容易阅读,而且脚本的流程更加一致。

【讨论】:

以上是关于何时在 PHP 中通过引用传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中通过引用传递无限参数[重复]

如何通过在 PHP 中通过引用传递变量来存储变量?

在python中通过引用传递引用

在C中通过引用传递数组?

带有引用参数的 foreach 何时危险?

在 C++ 中通过引用传递对象