派生类返回值的PhpStorm类型提示

派生类返回值的PhpStorm类型提示,php,phpstorm,phpdoc,type-hinting,Php,Phpstorm,Phpdoc,Type Hinting,是否可以提示PhpStorm,在下面的代码中,item()方法的返回值具有类型domeElement(不修改实际的PHP语句,即通过PhpStorm或插件的某些外部设置或使用某种PHPDoc注释等) 同样,请不要建议我修改代码中的语句,特别是部分$list->item(0)->getAttribute('test') 此外,我还发现了一个类似的问题,但它涉及用户定义函数的类型暗示,在我的例子中,函数item()是一个预定义的库函数 $doc = new DOMDocument(); $doc-&

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

同样,请不要建议我修改代码中的语句,特别是部分
$list->item(0)->getAttribute('test')

此外,我还发现了一个类似的问题,但它涉及用户定义函数的类型暗示,在我的例子中,函数
item()
是一个预定义的库函数

$doc = new DOMDocument();
$doc->loadXML('<x test="123"/>');
$list = $doc->getElementsByTagName('x');
if($list->length > 0)
    var_dump($list->item(0)->getAttribute('test'));
$doc=newDOMDocument();
$doc->loadXML(“”);
$list=$doc->getElementsByTagName('x');
如果($list->length>0)
变量转储($list->item(0)->getAttribute('test');
相应地,
$list->item(0)
返回
DOMNode
类的元素,该类没有
getAttribute()
方法。PhpStorm遵循这里的官方文档

但如果您在代码中添加额外的行并在调试器中对其进行分析(例如,
$z=$list->item(0);
),您将看到
$z
doElement
的实例,该具有此类方法


A.您不能动态地将文档添加到预定义方法(尤其是在链中)。不可能

B.正如您所见,文档中的“问题”在于:
item()
返回一个类的实例,而在您的特定情况下,它返回不同类的实例


很少有选择:

1。修改代码以引入中间变量,您可以向中间变量提供正确的类型提示。据我所知,你不想使用它

2.忽略这些警告:您可以完全禁用它,也可以仅为该文件禁用它;您可以降低严重性(例如,“信息”而不是“警告”)等

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

这可以通过修改实际的存根文件(PhpStorm发行版的一部分)在全局级别上完成,因此它将影响所有项目,您必须在再次升级到新版本后重新执行此操作

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

  • 从原始存根文件中提取
    DOMNodeList
    类的存根
  • 将其放在项目中的任意位置的单独文件中
  • 更改
    @return
    标记
    item()
    方法——将其设置为
    @return-DOMElement
    任何您需要的内容
这将使IDE“合并”来自两个来源的文档:排序
@return-DOMNode | DOMElement


再一次--这将涵盖您的具体情况--这将如何影响您的其他情况,我无法确定。

我不确定您不能编辑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'));
}

为了正确起见:您不能更改上面列出的任何代码吗?或者您无法更改项(0)调用的实现?@nivekastoreth只能更改空白-这包括添加作为空白子类的注释。在strubs中修复。外部库->PHP运行时->高级设置->默认strubs路径:C:\User\Name\这正是我不想做的-将
$list->item(0)->getAttribute('test')
拆分为几个部分并引入新变量。我想你可能会这么说。您只是说list()是预定义的,而不是调用$list->item()的代码也是不可修改的。提取我没有想到的存根文件,这非常聪明-尽管我认为如果有人发送给我,我会拒绝该代码审阅,因为如果PHP版本更改,这可能会导致误导文档。嗯。。这仅适用于IDE——这样的文件不需要包含在项目的实际代码库中(这也意味着:不要将这样的文件放在实际的项目中,只需链接它:通过附加的内容根或包含路径)。