【问题标题】:When using PHP7, is it necessary to document methods with PHPDoc?使用 PHP7 时,是否需要用 PHPDoc 记录方法?
【发布时间】:2017-09-28 09:10:09
【问题描述】:

在PHP7中,当一个方法设置给定的参数类型和结果类型时,是否需要在PHPDoc中再次记录?

自从

function foo(string $text): bool
{
    return true;
}

相当于

/**
 * @param string $text
 * @return bool
 */
function foo($text) {
    return true;
}

是否需要复制这些信息?

/**
 * @param string $text
 * @return bool
 */
function foo(string $text): bool
{
    return true;
}

编辑:我不使用 PHPDoc 来生成我的代码文档,而是在 PHPStorm 的帮助下为我和我的同事保持方法的一致性。

【问题讨论】:

  • 您是否运行过 phpdoc 来查看在声明参数和结果类型时它的行为?这会给你答案。
  • @JohnConde,PHPDoc 不能识别这种语法吗?
  • @MarcBrillault 他想说的是:试试看
  • PHPDoc 是一个文档文档,即提供有关函数、参数 aso 的描述。 IDE 使用它来获取有关签名的信息,这是一个很好的副作用。 “我不使用 PHPDoc 来生成我的代码文档”——因此,如果您出于某种原因不想要它,只需查看您的 IDE 获取的信息。如果您想添加一些东西,只需根据需要使用 PHPDoc cmets。恕我直言,任何团队开发人员都不应错过使用 PHPDoc 编写文档的机会。甚至在单独开发时也很有帮助。

标签: php php-7 phpdoc


【解决方案1】:

文档块是编码人员可以用来解释函数作用的东西,它将被 PHP 解析器忽略(请参阅下面的编辑),因为它只是一个注释,它是一个很好的练习在每个函数和方法上方放置一个文档块,因为当某人(或您)阅读代码时,更容易看到函数的作用。

IDE 通常使用 docblock 来自动完成,但是当块与代码不匹配时,docblock 将被 string:bool 覆盖

然而

function foo(string $text): bool
{
    return true;
}

不等于

/**
 * @param string $text
 * @return bool
 */
function foo($text) {
    return true;
}

第一个示例中的:bool 强制foo() 返回truefalse,否则PHP 将尝试将返回值强制转换为该类型或抛出致命错误。 与$text 的类型提示string 相同。第一个参数必须是字符串类型的值,否则 PHP 会尝试将其转换为字符串,否则会抛出致命错误

@return bool@param string 根本不执行任何操作,只是表示预期回报是 truefalse

举个例子:

function foo(string $a) :bool
{
    var_dump($a); // string '10'
    return "string";
}

var_dump(foo(10)); // bool true

没有问题,PHP 可以将10 转换为字符串,而"string"true 不过下面有问题

function foo(PDO $a) :bool 
{
    var_dump($a);
    return "string";
}

var_dump(foo(10)); // fatal error, 10 is not PDO and can not be cast to PDO

使用 docblock 将使最后一个工作(可能会遇到其他问题,因为您可能正在尝试使用 PDO 对象做某事)

注意:PHP 尚不支持混合类型类型提示(即字符串|数组),这仍需要通过在 docblock 中指定来完成

编辑:
正如@inwerpsel 在 cmets 中指出的那样,我关于 PHP 解析器忽略 docblock 的说法是不正确的。 ReflectionClass 可以在运行时读取文档块。

【讨论】:

  • 谢谢,但很惊讶 PHP 会尝试转换类型。在写这篇文章之前,我认为它总是会抛出一个致命错误,然后我去尝试了我的 foo 示例,结果让我感到惊讶
  • 如果您使用declare(strict_types=1) 强制执行类型提示和返回值检查,那么您可以依赖输入参数真正属于string 而不是int 类型,如前面的示例中那样,并返回值真正的bool,而不是前面例子中的string。简单地说,使用declare(strict_types=1),你就安全了。
  • “在每个函数和方法之上放置一个文档块是一个好习惯”——完全不同意!首先:最佳实践是编写只做一件事的函数。这也将使您更容易给这个函数起一个有意义的名字。如果一个函数的名称已经告诉我它的作用,我不需要额外的评论。
  • 不幸的是,您的建议是由许多开发人员完成的。而且很烦人!例如,如果函数被称为“getDataHandler”,为什么要在它上面放置一个文档块,上面写着“返回数据处理程序”?而且,如果您发现自己处于必须解释代码的情况,那么考虑重构可能会更好。
  • "它将被 PHP 解析器忽略,因为它只是一个注释" 这不是真的。文档注释有自己的解析器标记:T_DOC_COMMENT。除了可以在运行时使用ReflectionClass API 访问它之外,它将被视为与常规 T_COMMENT 相同的方式。
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2010-11-08
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多