是否可以提示 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'));
最佳答案
根据official docs $list->item(0)
返回没有 getAttribute()
方法的 DOMNode
类的元素。 PhpStorm 在此处遵循官方文档。
但是如果你在你的代码中添加额外的行并在调试器中分析它(例如 $z = $list->item(0);
),你会看到 $z
是DOMElement
的实例,它有 这样的方法。
A. 您不能即时向预定义方法(尤其是在链中)添加文档。没办法。
B. 如您所见——这里的“问题”在文档中:他们说 item()
在您的特定情况下返回一个类的实例如果它返回不同类的实例。
几个选项:
1. 修改您的代码以引入可以提供正确类型提示的中间变量。 据我所知,您不想使用它。
2. 忽略这些警告:您可以完全禁用它或只禁用该文件;你可以降低严重性(例如“信息”而不是“警告”)等
3. 更改文档(虽然不确定这是否是个好主意)。
这可以通过修改实际的 stub 文件(PhpStorm 分发的一部分...所以它会影响所有项目,您将不得不在再次升级到较新版本后重做)。
或者您可以在本地级别执行此操作(仅针对此项目):
- 从原始 stub 文件中提取
DOMNodeList
类的 stub - 将其放在项目中任意位置的单独文件中
- 改变
item()
方法的@return
标签——让它成为你在那里需要的任何东西的@return DOMElement
。
这将使 IDE 从两个来源“合并”文档:某种类型的 @return DOMNode|DOMElement
。
再一次——这将涵盖您的特定案例——这将如何影响您的其他案例,我无法说。
关于派生类返回值的 PhpStorm 类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24629338/