Считается ли плохой практикой так определять параметры метода?

/**
* @param array $arr
* @return array
*/
private static function myMethod (array $arr = null): array {

  if ($arr) {
   ...
  }
 ...      

  return $new_arr;
}

Синтаксической ошибки нет. Правильно ли так определять параметры по умолчанию или правильнее написать $arr = [] Является ли это плохой практикой?

Есть конечно правило:

Явное лучше, чем неявное!

Тим Петерс


Ответы (2 шт):

Автор решения: Kirill

не поместилось в комментарий, напишу тут )

doox911: так как при проверке мерж реквеста мне указали на то, что необходимо написать []. Я отчасти согласен, но почему пыха не ругается? И так же на закрепление материала. И да, если не передавать аргумент, то метод ведёт себя иначе.

Ну, не ругается, пушо ей не на что. вызов метода без аргуметна запустил преобразование типа и $arr стала null (что уже само по себе намекает на кривульку в архитектуре). Дальше, в if, null был приведён к false для сравнения. И с точки зрения php всё кашерно. А МР завернули, я так думаю, по той причине, что привидение массива к null должно быть обосновано некой необходимостью. Если её нет, надо передавать пустой массив. Любому, читающему ваш код должно быть понятно, почему там null, должна быть причина. И если причины для приведения типа нет, то и использовать это не стоит. На протяжении всего метода, аргумент должен вести себя предсказуемо, не меняя тип. Это затрудняет чтение и понимание логики и может приводить к ошибкам/неожиданным результатам.

Типо того - садишся в трамвай 20й номер, а на пол пути видишь, что едешь по 22му маршруту. И кондуктор на ходу меняет номер на 38й ;)

→ Ссылка
Автор решения: Ипатьев

но почему пыха не ругается?

Аксиома Кана.
Если ничто другое не помогает, прочтите, наконец, инструкцию!

Объявление типов может принимать значения NULL, если значение по умолчанию для аргумента является NULL.

Считается ли плохой практикой так определять параметры метода?

Если мы используем строгую типизацию, то для дефолтного параметра следует использовать объявленный тип. То есть вместо $arr = null следует писать $arr = [], что и было указано в code review.

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

→ Ссылка