使用PHP7时,是否需要使用PHPDoc记录方法?

Mar*_*ult 16 php phpdoc php-7

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

以来

function foo(string $text): bool
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

相当于

/**
 * @param string $text
 * @return bool
 */
function foo($text) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

是否有必要复制这些信息?

/**
 * @param string $text
 * @return bool
 */
function foo(string $text): bool
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

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

Jel*_*rgu 18

docblock是编码器可以用来解释函数的功能,它会被PHP解析器忽略,因为它只是一个注释,将docblock放在每个函数和方法之上是一个好习惯,因为当某人(或者你)阅读代码,更容易看到该功能的作用.

甲IDE通常采用的docblock为自动完成,所述的docblock然而,应当由重写string:bool当块不匹配的代码

然而

function foo(string $text): bool
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

不等同于

/**
 * @param string $text
 * @return bool
 */
function foo($text) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

:bool第一个例子强制执行foo()的回报无论是truefalse,别的和PHP将尝试把返回到该类型或抛出一个致命错误.它与typehint相同string$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
Run Code Online (Sandbox Code Playgroud)

没有问题存在,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
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:
正如@inwerpsel在评论中指出的那样,我的说法是PHP解析器忽略了docblock是不正确的.ReflectionClass可以在运行时读取docblock .

  • 谢谢,但很惊讶地看到 PHP 会尝试强制转换类型。在写这篇文章之前,我认为它总是会抛出一个致命的错误,然后我去尝试了我的 foo 示例,结果让我感到惊讶 (2认同)
  • 如果你使用 `declare(strict_types=1)` 强制类型提示和返回值检查,那么你可以依赖输入参数的类型为 `string` 而不是 `int`,如前面的例子,并且返回值 real`bool ` 而不是前面示例中的 `string`。简单地说,使用 `declare(strict_types=1)` 就安全了。 (2认同)
  • “将docblock放在每个函数和方法之上是一个好习惯”-完全不同意!首先:最佳实践是编写只做一件事的函数。这也将使您自己更容易为该功能命名。而且,如果一个函数的名称已经告诉我它的功能,则不需要额外的注释。 (2认同)