在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()的回报无论是true或false,别的和PHP将尝试把返回到该类型或抛出一个致命错误.它与typehint相同string的$text.第一个参数必须是string类型的值,否则PHP会尝试将其强制转换为字符串,否则将抛出致命错误
在@return bool和@param string所有强制没什么,只是说,预期收益或者是true或false
请看以下示例:
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 .