派生类返回值的PhpStorm类型提示
是否可以提示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-&
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
@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——这样的文件不需要包含在项目的实际代码库中(这也意味着:不要将这样的文件放在实际的项目中,只需链接它:通过附加的内容根或包含路径)。