你可以为一个类创建一个外部 PHPdoc 吗?

Posted

技术标签:

【中文标题】你可以为一个类创建一个外部 PHPdoc 吗?【英文标题】:Can you create an external PHPdoc for a class? 【发布时间】:2016-12-21 05:30:03 【问题描述】:

假设我有以下内容

class Something extends ClassWithMagicMethods

通常我会为我知道存在的任何属性添加一个文档块,即使通过魔术方法访问也是如此

/**
 * @property string $someVar
 * @method SomeClass getSomeClass()
 */
class Something extends ClassWithMagicMethods

这很好用,但我想知道我们是否可以将该 docblock 与类的定义分开。两种可能的用例:

不包含 docblock 但我希望从我的 IDE 自动完成的第三方包 - 我希望能够在某处添加我自己的 docblock。 扩展系统 - 在定义扩展的文件中,我想记录此扩展添加到类的新属性。

我知道我可以在技术上创建一个虚拟的 ide_helper.php 文件,该文件永远不会真正运行 - 只是由 IDE 索引 - 不幸的是,这会导致任何体面的 IDE 抱怨我不想要的重复声明,因为它也会使代码导航较慢。

那么 - 是否可以通过在类定义外部组合多个文档块来记录 PHP 类?

我在 SO 上得出的大多数结果都只是引用了记录未知类型的文档,你在哪里使用它们,这不是我需要的。即:

/** @var Something $something */
$something = FactoryMethodThing::create('Something');

【问题讨论】:

不,大多数文档块解析器与类一起读取文档块。公平地说,不错的 IDE 不需要文档块来提供自动完成功能。如果 IDE 能够对代码进行标记和词法分析(例如 phpstorm 这样做),则可以直接从代码中提供自动完成功能。此外,为不存在的类读取文档块是没有意义的。 @Sherif 我使用 PHPstorm,但我明确地谈论了实际上不在代码中的动态属性和方法(一个很好的例子是没有定义属性的 ORM 类)。 我可以理解,但是为代码中不存在的类放置一个 doc 块有什么意义?通常文档块与类一起读取,因为解析器可以将文档块与该类相关联。在实践中试图将它们分开是没有意义的。 此外,任何在代码中动态生成的属性都将无法记录,因为它们依赖于了解有关运行时的信息。 doc 块通常基于不需要任何运行时知识的静态分析规则。很抱歉成为坏消息的暴露者,但这个想法在实践中并不是好兆头。 你跳过了我上面提到的两个用例,一个没有记录的第三方包(想想作曲家),或者一个扩展系统,所以原始类不知道关于您的扩展正在添加的新属性,但扩展显然是这样做的(我不是指classB extends classA,我指的是基于注入的扩展系统),这样的事情有有效的用例。另一个很好的例子是记录 Guzzle 服务工厂,因为这些类完全在运行时生成。 【参考方案1】:

看看这对你有没有帮助:

phpdoc -d path/to/my/project -f path/to/an/additional/file -t path/to/my/output/folder

来源:http://docs.phpdoc.org/guides/running-phpdocumentor.html

【讨论】:

以上是关于你可以为一个类创建一个外部 PHPdoc 吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHPDoc:@return void 有必要吗?

java内部类可以访问外部类的静态方法吗

phpDoc 类常量文档

内部类可以引用它的包含类(外部类)的成员吗?有没有 什么限制?

PHPDoc 或类型提示类作为方法的参数

派生类中 PHPDoc 中的 PHP 类型提示