php return или reference?

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

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

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

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

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

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

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

благодаря

Related of "php return или reference?"

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

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

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

вместо:

 $hash = md5($data); 

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

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

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

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

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

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

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

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

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

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

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