mar*_*gpl 6 php arrays optimization php-internals
PHP引擎会优化第二个示例来传递$arr引用吗?
function test1(array &$arr)
{
$arr[] = 123;
echo $arr[0];
}
function test2(array $arr)
{
echo $arr[0];
}
Run Code Online (Sandbox Code Playgroud)
PHP 使用一种称为“写时复制”的机制来避免过度复制变量,只要不需要这样做即可。所以即使在你的test2()例子中也$array根本没有被复制。$array如果您在函数内部进行修改,PHP 将复制该变量以允许修改。这个机制的详细解释可以参见《PHP Internals Book》的“内存管理”一章。以下引用来自“引用计数和写时复制”部分:
\n\n\n如果您稍微考虑一下上面的内容,您\xe2\x80\x99 就会得出结论\n PHP 一定进行了大量的复制。每次将某些内容传递给函数时,都需要复制该值。对于整数或双精度数来说,这可能不是特别有问题,但想象一下将一个包含一千万个元素的数组传递给一个函数。每次调用时复制\n 数百万个元素将会非常慢。
\n\n为了避免这种情况,PHP 采用了写时复制范例:一个 zval 可以被多个变量/函数等共享,只要它只能读取且不被修改。如果其中一位持有者想要修改它,则需要在应用任何更改之前复制 zval。
\n
以下两篇文章提供了对此主题的更多见解(均由 PHP 核心开发人员撰写):
\n\n第一个甚至解释了为什么仅出于性能原因使用引用通常是一个坏主意:
\n\n\n\n\n人们使用引用的另一个原因是他们认为这会使代码更快。但这是错误的。更糟糕的是:引用大多\n会使代码变慢!
\n\n是的,引用通常会使代码变慢 - 抱歉,我不得不\n重复一遍以使其清楚。
\n
第二个说明了为什么在 PHP5+ 中对象并不是真正通过引用传递的。
\n