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, так как его гораздо легче читать, а поток скрипта более согласован.