Когда я должен использовать NULL в подсказках типа PHPDoc и docblocks?

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

Пример 1: значения по умолчанию. Следующая функция ожидает только ненулевые значения. Но если значение не передается, по умолчанию null и проверяет это явно как способ определить, было ли что-либо передано, и возвращает специальное значение для этого случая. Надеюсь, ни один внешний абонент не пропустит ничего, кроме целого числа. Должен null использоваться в @param введите, как показано ниже, или он должен только указать int так как это то, что мы хотим передать, если что-нибудь передается?

/**
 * @param int|null $bar
 */
function foo($bar = null) {
  if(is_null($bar)) { 
    return 'ABC';
  }

  return doSomething($bar);
}

Пример 2: свойства экземпляра. Мы только хотим, чтобы $ bar содержал целые числа. Тем не менее, если для bar ничего не установлено, значение PHP по умолчанию для этого свойства экземпляра равно нулю. Нужно ли учитывать это в каждом месте, где используется $ bar, с возможным нулевым типом, как показано ниже?

class Foo {
  /**
   * @var int|null
   */
  public $bar;

  /**
   * @param int|null $bar
   */
  public setBar( $bar) {
    $this->bar = $bar;
  }

  /**
   * @return int|null
   */
  public function getBar() {
    return $this->bar;
  }
}

В основном я мусор почти каждый @param а также @var декларация с |null потому что технически это может быть то значение. Но на практике это не должно быть. Должен ли я ожидать, что почти все мои типы будут содержать возможность null или если это предполагается, и я должен избегать его указания, если я не собираюсь установить или получить значение null явно?

2 ответа

На практике, я бы предпочел, чтобы теги param только перечисляли то, что вы хотите передать. Однако для возвращаемых тегов вам действительно нужно перечислить все типы, которые могут быть возвращены. Вот почему я не согласен с этими двумя.

Поскольку PHP не является строго типизированным, даже если вы говорите "только передать в int", ваш метод все равно должен убедиться, что он не передал что-то неожиданное. Просто потому, что код метода пытается обрабатывать прием других типов, вы не хотите, чтобы ваши документы сообщали пользователям: "Конечно, вы можете передать мне NULL, и я сделаю что-нибудь для вас". Вы хотите, чтобы ваши документы сказали "дай мне int, точка".

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

Да, по стандартам PHPDoc, вы должны включать null везде (если это применимо, конечно)

Смотрите здесь: http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.param.pkg.html

Тип данных должен быть допустимым типом PHP (int, string, bool и т. Д.), Именем класса для типа объекта или просто "смешанным". Кроме того, вы можете перечислить несколько типов данных для одного параметра, разделив их с помощью канала (например, "@param int|string $p1"). Вы можете задокументировать перечисленные параметры или любые необязательные параметры, которые будут проанализированы стандартными функциями PHP func_num_args()/get_func_arg(). Рекомендуемый формат имени для параметров, перечисленных с помощью func_get_arg(): $paramname, если есть только один параметр $paramname,... если количество параметров не ограничено

Другие вопросы по тегам