2017-04-30 44 views
5

在PHP7中,当方法设置给定的参数类型和结果类型时,是否需要在PHPDoc中再次记录它们?使用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的帮助同事在方法的一致性。

+0

您是否运行phpdoc以查看它在声明参数和结果类型时的行为?这会给你你的答案。 –

+0

@JohnConde,是不是PHPDoc能够识别这种语法? –

+0

@MarcBrillault他想说的是:**试试看看吧** – Xatenev

回答

4

的文档块的东西,一个编码器可以用它来解释的功能是什么,它将被PHP解析器会被忽略,因为它只是一个评论它是一个将docblock放在每个函数和方法之上的好做法是,因为当某人(或您)读取代码时,更容易看到该函数的功能。

一个IDE通常采用的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确实尚未支持混合类型typehinting(即字符串|数组)仍然必须通过在docblock中指定它来完成

+0

感谢您的完整答案!也提到混合类型。 –

+0

谢谢,但很惊讶地发现PHP会尝试投射这些类型。在写这篇文章之前,我认为它总会抛出一个致命的错误,然后我去尝试我的foo例子,并且对结果感到惊讶 – Jelmergu

+0

如果你用'declare(strict_types = 1)'强制执行类型提示和返回值检查,那么你可以依靠输入参数的确是类型'string'而不是像前面例子中的'int'那样,并且像前面的例子那样返回真正的'bool'而不是'string'。简单地说,使用'declare(strict_types = 1)',你很安全。 – ManInTheBox

3

在PHP 7中这不是必需的,因为它们是相同的。如果两者都有,那么如果以后你改变另一个而不改变另一个,它可能实际上不同步。

在这里你可以找到更多的信息 https://wiki.php.net/rfc/scalar_type_hints_v5

相关问题