13

null在使用PHPDoc 描述变量时,我对何时使用 as 类型感到困惑。类型提示是否应该描述外部调用者预期和遵守的希望和期望,或者它们是否应该记录变量的所有可能类型,即使希望它在实践中是一种非常具体的类型?

示例 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 值为 null。我是否需要在每个使用 $bar 的地方都考虑到这一点,可能的 null 类型如下?

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明确设置或接收一个值?

4

2 回答 2

13

在实践中,我倾向于让 param 标签只列出您想要传入的内容。但是,对于返回标签,您确实需要列出可能返回的每种类型。这就是我对两者不同的原因。

由于 PHP 不是强类型的,即使你说“只传递一个 int”,你的方法仍然需要确保它没有传递一些意想不到的东西。仅仅因为方法代码试图处理接收其他类型,你不希望你的文档告诉你的用户“当然,你可以给我一个 NULL,我会为你做一些事情”。您希望您的文档说“给我一个 int,句号”。

在考虑返回值时,您的用户确实确实需要知道可能从您的方法返回的每种潜在返回类型,因为他们确实需要在代码中覆盖其基础以处理您的方法可能返回的所有类型。

于 2012-10-01T14:06:35.907 回答
2

是的,按照 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,... 如果参数数量不限

于 2012-10-01T03:22:46.383 回答