Когда передавать по ссылке в PHP - PullRequest
30 голосов
/ 28 января 2010

Мне интересно, рекомендуется ли передавать по ссылке, когда вы только читаете переменную, или всегда следует передавать ее как значение.

Пример с передачей по ссылке:

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

Ответы [ 5 ]

46 голосов
/ 28 января 2010

Если вы хотите передать значение (чтобы функция не изменяла его) , нет причины передавать его по ссылке: это только усложнит ваш кодчтобы понять, как люди подумают " эта функция может изменить то, что я передам ей - о, это не изменит это? "

В приведенном вами примере ваш do_my_hash функция не изменяет значение , которое вы передаете ему;поэтому я бы не стал использовать ссылку.

И если вы беспокоитесь о производительности, вам следует прочитать это недавнее сообщение в блоге: Не использовать ссылки PHP :

Другая причина, по которой люди используют ссылки, заключается в том, что они думают, что это делает код быстрее.Но это неправильно.Это еще хуже: ссылки в основном делают код медленнее!Да, ссылки часто делают код медленнее. Извините, мне просто пришлось повторить это, чтобы прояснить ситуацию.

На самом деле, эта статья может быть интересной для чтения, даже если вас в первую очередь не волнуетпроизводительность; -)

12 голосов
/ 29 января 2010

PHP максимально использует копирование при записи (всякий раз, когда это обычно увеличивает производительность), поэтому использование ссылок не даст вам никакого выигрыша в производительности; это будет только больно. Используйте ссылки только тогда, когда они вам действительно нужны. Из руководства по PHP:

Не не используйте возврат по ссылке для увеличения производительности. Двигатель автоматически оптимизирует это самостоятельно. Возвращайте ссылки только в том случае, если у вас есть для этого техническая причина.

8 голосов
/ 29 января 2010

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

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

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

3 голосов
/ 28 января 2010

Радость микрооптимизации. : -)

Если честно, то, передавая «нормальные» переменные по ссылке, вы вряд ли сможете получить что-то особенное (если вы не хотите влиять на их значение в их исходной области видимости). Кроме того, поскольку объекты PHP 5 автоматически передаются по ссылке.

2 голосов
/ 28 января 2010

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

...