Когда изменять и когда дублировать аргументы?

Рассмотрим функции sort и array_reverse.

Почему один изменяет переданную переменную, а другой возвращает новую версию?

$a = array(3, 1, 2);

sort($a);
// $a === array(1, 2, 3)

array_reverse($a);
// $a === array(1, 2, 3)

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

Причина, по которой я спрашиваю, заключается в том, что я хочу знать, существуют ли какие-либо рекомендации для принятия решения о том, следует ли писать функции, используя подход «передача по ссылке и изменение» или подход «проход по ссылке». значение, изменить и вернуть".


person nickf    schedule 04.01.2010    source источник


Ответы (3)


Одной из неприятностей PHP является то, что API действительно противоречив. Например:

  • Несогласованный порядок параметров (игла, стог сена);
  • Непоследовательное использование подчеркивания. Некоторые функции даже используют подчеркивание в одной части, но не используют в другой.

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

person cletus    schedule 04.01.2010
comment
да, методы PHP есть во всем магазине, но есть ли у вас какие-либо рекомендации по написанию собственных функций? - person nickf; 04.01.2010

Я думаю, что намерение пользователя, вероятно, самое важное здесь. Не то, чтобы это было очень очевидно в конкретном примере, который вы выбрали, но в целом я бы предположил, что я хотел бы подумать о том, что ожидает пользователь (деструктивная модификация на месте против вновь созданных возвращаемых значений) при разработке API .

person danben    schedule 04.01.2010

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

person K Prime    schedule 04.01.2010