返回值还是修改引用?

kev*_*314 4 php performance choice pass-by-reference pass-by-value

我以前见过这两个,据我所知,它几乎是主观的,但如果给出选项,你会做什么以及为什么?如果数据很大,那么其中一个数据会有任何速度/内存优势吗?

function processData(&$data_to_process) { // Pass by reference.
    // do something to the data
}

// ... somewhere else

$this->processData($some_data);
Run Code Online (Sandbox Code Playgroud)

要么

function processData($data_to_process) { // Pass by value.
    // do something to the data
    return $data_to_process;
}

// ... somewhere else

$some_data = $this->processData($some_data);
Run Code Online (Sandbox Code Playgroud)

Mat*_*hew 5

PHP写入时会复制,因此如果数据在函数中没有变化,使用引用只会使事情运行得更慢.

在您的情况下,您正在更改数据,因此将进行复制.测试如下:

<?php

define('N', 100000);
$data = range(1, N);
srand(1);

function ref(&$data)
{
        $data[rand(1, N)] = 1;
}

function ret($data)
{
        $data[rand(1, N)] = 1;
        return $data;
}

echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";

ref($data);
// $data = ret($data);

echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";

?>
Run Code Online (Sandbox Code Playgroud)

ref()一次和一次运行它ret().我的结果:

REF()

  • 8043280(之前/当前)
  • 8044188(之前/峰值)
  • 8043300(后/当前)
  • 8044216(后/峰值)

RET()

  • 8043352(之前/当前)
  • 8044260(之前/峰值)
  • 8043328(之后/当前)
  • 12968632(后/峰值)

因此,正如您所看到的,PHP在修改函数中的数据并返回时会占用更多内存.所以最好的情况是通过引用传递.

但是,如果它不明显发生,那么通过引用传递可能是危险的.通常,您可以通过将数据封装在修改自己数据的类中来完全避免这个问题.

请注意,如果您使用对象,PHP5始终通过引用传递它们.