Вернуть значение или изменить ссылку? - PullRequest
4 голосов
/ 05 сентября 2010

Я видел и то, и другое, и, насколько я знаю, это в значительной степени субъективно, но если бы у вас была возможность, что бы вы сделали и почему?Если бы данные были большими, было бы какое-то преимущество в скорости / памяти для одного из них?

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

// ... somewhere else

$this->processData($some_data);

или

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);

Ответы [ 2 ]

5 голосов
/ 05 сентября 2010

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";

?>

Запустите его один раз с ref() и один раз с ret().Мои результаты:

ref ()

  • 8043280 (до / текущее)
  • 8044188 (до / максимальное)
  • 8043300 (после / текущее))
  • 8044216 (после / пик)

ret ()

  • 8043352 (до / текущий)
  • 8044260 (до /пик)
  • 8043328 (после / текущий)
  • 12968632 (после / пик)

Итак, как вы можете видеть, PHP использует больше памяти при изменении данныхв функции и возвращая ее.Поэтому оптимальным вариантом является передача по ссылке.

Однако передача по ссылке может быть опасной, если не очевидно, что это происходит.Часто вы можете полностью избежать этого вопроса, заключив ваши данные в классы, которые изменяют свои собственные данные.

Обратите внимание, что если вы используете объекты, PHP5 всегда передает их по ссылке.

0 голосов
/ 05 сентября 2010

В большинстве случаев избыточно возвращать ссылку, которая уже есть у вызывающего абонента, что происходит во втором примере.Единственный случай, когда я могу вспомнить, где это полезно, - это цепочка вызовов методов.

Обычно используйте ссылочный параметр, когда функция изменит состояние этого параметра, и используйте возвращаемое значение, чтобы ввести что-то новое.звонящему.

...