PHP类型提示-代码与注释

PHP类型提示-代码与注释,php,phpdoc,type-hinting,Php,Phpdoc,Type Hinting,PHP5可以做一些(有限的),但是,在我看来,在现实世界的项目中,类型通常在文档注释中描述。例如,与此相反: /** * Test method */ function test(SomeType $param1) { ... } 更常见的是 /** * Test method * * @param SomeType param1 */ function test($param1) { ... } 这两种方法的优缺点是什么?如果我的假设是正确的,PhpDoc方法更

PHP5可以做一些(有限的),但是,在我看来,在现实世界的项目中,类型通常在文档注释中描述。例如,与此相反:

/**
 * Test method
 */
function test(SomeType $param1) {
    ...
}
更常见的是

/**
 * Test method
 *
 * @param SomeType param1
 */
function test($param1) {
    ...
}
这两种方法的优缺点是什么?如果我的假设是正确的,PhpDoc方法更普遍,那为什么呢?为什么人们不更多地利用内置的语言功能呢

编辑:第三种选择是结合使用两种方法:

/**
 * Test method
 *
 * @param SomeType param1
 */
function test(SomeType $param1) {
    ...
}

然而,我个人并没有看到过这种方法被频繁使用(查看了Symfony或PHPUnit之类的库),老实说,这也似乎是为了没有多少额外的好处而做了一些工作。也许这就是为什么它不经常出现的原因。

就我个人而言,我会同时使用这两种方法


第一个选项适用于控制要传递给方法的对象。第二个通常可以由任何现代IDE自动添加,它使您的代码更具可读性。

第一件事:PHP类型提示与PHPDoc具有不同的提示能力。差异(至少):

  • 标量类型。在PHP7.1之前,您不能提示标量类型,但没有什么可以阻止您进行提示

    /**
     * @param string $param Param description
     */
    
  • 一连串的暗示。在PHPDoc中,您可以提示,该参数(或返回值)是某物的数组。它将是:

    /**
     * @param ClassName[] $param Param description
     */
    
    这意味着,
    ClassName
    的实例数组。这在返回类型时非常有用(因为IDE可能会在该数组的迭代中替换方法,因此,您将知道您所做的事情是否正确)。然而,在PHP中,您只能将其键入为

    function functionName(array $param) { /*...*/ }
    
    所以不可能知道什么是数组的实际元素。关于您的信息,这里有一个对应的For-typehinting作为一些元素的数组,它目前被拒绝了,但将来可能会在PHP中出现这种可能性


但是,另一方面,使用PHP类型提示仍然是不同的事情,通常您应该同时执行这两项操作——因此,如果可以在PHP中以某种方式进行提示(如上面的数组示例),那么就执行这项操作,并添加PHPDoc块。PHP typehint允许您在语言级别强制执行行为,而PHPDoc只是“信息”源,它只服务于信息目标,不能阻止传递非法参数类型。

首先,您还可以创建
@param SomeType$param1
。并且它阻止您传递除
SomeType
之外的任何其他类型的类型。Second将只在phpDoc中显示它,但是
$param1
可以是任何类型。好的一点,我已经更新了OP。如果您使用的是带有自动完成功能的IDE,您还可以在内联中键入提示,这会不时派上用场:/*@var$somevar\YourNamespace\YourObject*/记录:PHP已经进化。它的新版本有更强大的暗示能力(可以做标量,数组返回类型,空值…)。虽然从理论上讲,两种类型的提示都会让人感觉更好,但在实践中可能不会增加太多的价值,至少在我看来是这样,如果你看看现实世界中的项目,我似乎并不孤单。但它增加了价值。如果您有一些实例的数组,那么您将在PHP和PHPDoc中键入hint,这样您至少无法将非数组传递给函数(在语言级别),另一方面,您将能够使用IDE替换。所以-是的,PHP类型提示是有限的,但是您应该尽可能多地使用它们来缩小传入的参数类型,如果您知道在执行时实际执行类型的上下文是将类型提示放入代码本身的原因的话。将其放在PHPDoc中是一种常见的做法,主要是因为PHPDoc早于PHP类型暗示,因此,在用户了解代码期望的情况下,让PHPDoc记录一个类型是最好的方法。文档生成器通常会假定PHPDoc信息是真实的信息并使用它,尽管如果没有给出PHPDoc,它们也会回到代码本身。IDE通常遵循相同的行为。