大家好!在我看来,MediaWiki的PHPCS规则集主要源于PHP版本,其中静态类型声明(以前称为“type提示”)不存在。随着我们朝着更现代的代码迈进,我认为规则应该放松,其他规则应该调整。更具体地说,我想了解大多数人是否同意以下命题和结论:命题1:*一些代码通过名称和类型进行了充分记录*,并且不需要其他文档。其他情况文档是必需的,确实存在,但它们只能是由人工审查人员确定,而不是由自动化工具确定。您可以在现有代码中看到这一点,只要文档注释指定了类型(带有@var、@param或@return),但没有附加文本。对于例如,在CreditsAction中<https://gerrit.wikimedia.org/g-mediawiki/core网站/+/de752f45af/includes/actions…>,不需要告诉任何人LinkRenderer将用于呈现链接,或者UserFactory创建User对象:类CreditsAction扩展了无模板Action{/**@var LinkRenderer*/私有$linkRenderer;/**@var用户工厂*/私有$userFactory;同样,没有必要详细解释字符串由LinksTable::getTableName()返回<https://gerrit.wikimedia.org/g-mediawiki/core网站/+/de752f45af/includes/deferre…>是表名,ActorCache::remove的$actor参数(UserIdentity$actor)<https://gerrit.wikimedia.org/g-mediawiki/core网站/+/de752f45af/includes/user/Ac…>表示要从缓存中删除的参与者,或信息$m和返回的MessageValue位于Message\Converter::convertMessage()中<https://gerrit.wikimedia.org/g-mediawiki/core网站/+/de752f45af/includes/Message…>:/***将消息转换为MessageValue*@param消息$m*@return消息值*/公共函数convertMessage(消息$m){(我想澄清的是,在最后一个例子中,我只是在谈论@param和@return标记已经没有任何散文文本。而方法注释“Convert a Message to a MessageValue”也可能是被认为是多余的,我认为这会引起更多的争议,而我不是主张今天取消这一点。)命题2:*将类型添加为静态类型通常更可取*与文档注释不同,静态类型是在运行时检查的,因此保证正确(只要代码运行);小的运行时成本应通过以下方面的性能改进部分抵消更新的PHP版本,否则被认为是值得的。新代码通常应尽可能包括静态类型,现有代码可能添加静态类型作为其他工作的一部分。我相信这一点描述了我们作为MediaWiki开发人员的当前开发实践。请注意,一些旧的MediaWiki类被认为不适合静态类型,并且只应在注释中使用;这将有助于将来从这些类迁移(参见T240307#6191788<https://phabricator.wikimedia.org/T240307#6191788>).命题3:*类型可以无损地表示为PHP静态类型,文档注释中的类型是不必要的。*当文档注释为认为对于类型以外的实际文档是必要的,那么类型通常仍包括在内(Phan将检查它是否与静态类型),但不需要进一步的文档(请参阅建议1然后可以省略@var、@param等doc注释。注意,根据PHP版本,并非所有类型都可以无损表示为PHP静态类型(例如,联合类型和混合类型都需要等待PHP 8.0,PHP 8.2为null和false);在这种情况下,doc评论仍然是必要的。结论:*我们应该更新PHPCS规则集,以减少文档需求注释。*具体的规则可能有待决定,具体取决于多少我们愿意投入到嗅探实现中的工作(例如,它是不是仅当参数没有时,才可以要求/**@param*/doc注释静态类型?),但总的来说,我认为我们需要这样的代码我们的标准PHPCS规则集允许以下内容:类CreditsAction扩展了无模板Action{私有LinkRenderer$LinkRenderer;私有UserFactory$UserFactory;/**将消息转换为MessageValue*/公共函数convertMessage(Message$m):MessageValue{当文档注释仍然是必需的或至少是有益的,因为光靠类型是不够的信息,这要由人类来决定编写代码或在代码评审期间指出它。人们对此有何看法PS:在PHP8中,我们可以使用构造函数属性升级:类CreditsAction扩展了无模板Action{公共函数__construct(第$Page页,IContextSource$上下文,私有LinkRenderer$LinkRenderer,私有UserFactory$UserFactory) {父级::__construct($page,$context);}(再次声明,我并不是说所有代码都应该是这样的,但我认为我们拥有大量现有代码,这些代码实际上不需要额外的代码文档中的信息,可以转换为没有任何损失。)干杯,卢卡斯-- 卢卡斯·沃克梅斯特(Lucas Werkmeister)软件工程师德国维基媒体有限公司|Tempelhofer Ufer 23-24|10963 Berlin电话:+49(0)30-577 11 62-0https://wikimedia.de(维基媒体)想象一个每个人都可以自由分享所有知识的总和。帮助我们实现我们的愿景!https://spenden.wikimedia.de德国维基媒体-Gesellschaft zur Förderung Freien Wissens e.V。柏林-夏洛滕堡高等法院登记处编号23855 B.Als gemeinnützig anerkannt durch das FinanzamtürKörperschaften I Berlin,Steuernummer 27/029/42207年。