Подтвердить что ты не робот

Когда переходить по ссылке в PHP

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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