PhpStorm类型提示派生类返回值

时间:2014-07-08 10:21:40

标签: php phpstorm phpdoc type-hinting

是否有可能提示PhpStorm在下面的代码中返回item()方法的值具有类型DOMElement没有修改实际的PHP语句,即通过一些外部设置PhpStorm或插件或使用某种PHPDoc评论等)?

再次,请不要建议我修改代码中的陈述,特别是$list->item(0)->getAttribute('test')部分。

另外,我发现了一个类似的问题PhpStorm type-hinting for factories?,但它处理了用户定义函数的类型提示,在我的例子中,函数item()是一个预定义的库函数。

$doc = new DOMDocument();
$doc->loadXML('<x test="123"/>');
$list = $doc->getElementsByTagName('x');
if($list->length > 0)
    var_dump($list->item(0)->getAttribute('test'));

PhpStorm warning

2 个答案:

答案 0 :(得分:6)

相应于official docs $list->item(0)返回DOMNode类没有getAttribute()方法的元素。 PhpStorm遵循官方文档。

但是如果你在你的代码中添加额外的行并在调试器中进行分析(例如$z = $list->item(0);),你会发现$z拥有的DOMElement的实例这样的方法。


A. 您无法动态地向预定义方法(特别是在链中)添加文档。没办法。

B。正如您所看到的 - &#34;问题&#34;这里是文档:他们说item()返回一个类的实例,而在你的特定情况下,它返回不同类的实例。


几个选项:

1。修改代码以引入中间变量,您可以为其提供正确的类型提示。 据我了解,您不想使用它。

2。忽略这些警告:您可以完全禁用它或只删除该文件;你可以降低严重程度(例如&#34;信息&#34;而不是&#34;警告&#34;)等等

3. 更改文档(不确定这是不是一个好主意)。

这可以通过修改实际的存根文件(PhpStorm发布的一部分......在全局范围内完成...因此它将影响所有项目,并且在重新升级到更新的版本后你将不得不重做它。)

或者您可以在本地级别执行此操作(仅适用于此项目):

  • 从原始存根文件中提取DOMNodeList类的存根
  • 将其放在项目中任意位置的单独文件中
  • 更改@return方法的item()标记 - 将其@return DOMElement设为您需要的任何内容。

这将使IDE&#34;合并&#34;来自两个来源的文档:排序@return DOMNode|DOMElement

再次 - 这将涵盖您的特定情况 - 这将如何影响您无法分辨的其他情况。

答案 1 :(得分:1)

我不确定你不能编辑PHP语句但同时能够编辑PHPDoc注释是什么意思,但你可以通过执行以下操作来完成你所要求的:

<?php
$doc = new DOMDocument();
$doc->loadXML('
<x test="123"/>');
$list = $doc->getElementsByTagName('x');
if($list->length > 0) {
    /** @var DomElement $element */
    $element = $list->item(0);
    var_dump($element->getAttribute('test'));
}

但这在技术上并不安全,因为getElementsByTagName返回一个DomNodeList,它指定它包含DomNodes(虽然我不熟悉,不知道所有实际用途是否只包含DomElements)

无论哪种方式,当我查看此示例代码时,正在使用的方法已经正确记录,您的问题是您正在尝试指定,如上所述,未强制执行的特殊约束(具体) DOM代码/评论。