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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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