是否有可能提示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'));
答案 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代码/评论。