php возврат или ссылка? - PullRequest
2 голосов
/ 01 марта 2012

У меня есть пара функций, которые манипулируют данными в массиве, например, unset_data() вы передаете ему значение и неограниченное количество строковых аргументов, таких как:

unset_data( $my_array, "firstname", "password" );

и может работать с многомерными массивами и т. Д., Довольно просто.

Но должна ли эта функция использовать ссылку на массив и изменить ее напрямую?

Или я должен вернуть новый массив со значениями unset.

Я никогда не могу решить, должна ли функция использовать ссылку или нет,

Есть ли конкретные случаи или примеры, когда и когда их не использовать ??

Спасибо

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

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

Скажем, md5 изменит данные на месте,было бы довольно неудобно, так как я обычно хочу сохранить исходные данные нетронутыми.Поэтому я всегда должен был делать это:

$hash = $data;
md5($hash);

вместо:

$hash = md5($data);

Это довольно уродливый код, навязанный вам API этой функции.

Однако для unset я не думаю, что типичный вариант использования предназначен для получения новых данных:

$arr = unset($arr['foo']);

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

4 голосов
/ 01 марта 2012

Вообще говоря, лучше возвращать по значению, а не брать ссылку, потому что:

  1. Это наиболее распространенный шаблон использования (об этой конкретной функции следует помнить меньше)
  2. Вы можете свободно создавать цепочки вызовов, например, Вы можете написать array_filter(unset_data(...))
  3. Вообще говоря, код без побочных эффектов (я называю мутацию аргумента способом, видимым вызывающей стороне как побочный эффект) легче рассуждать о

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

1 голос
/ 01 марта 2012

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

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

Я не думаю, что есть веский аргумент в пользу «наилучшей практики» с любым из вариантов здесь, поэтому краткий ответ будет таким:

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

...