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

标签 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

最佳答案

根据official docs $list->item(0) 返回没有 getAttribute() 方法的 DOMNode 类的元素。 PhpStorm 在此处遵循官方文档。

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


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/

相关文章:

php - Doctrine 2.1 - 日期时间列默认值

node.js - PhpStorm 无法识别 node.js 语法

phpunit - PHPUnit 8.4 的 PhpStorm 给出异常 Uncaught PHPUnit\Runner\Exception class ... 无法找到

PHPUnit 和 PHPStorm ... ResultPrinter.php 错误

php - 简单的破旧,全面的 phpDocumentor 教程?

php - 从php中的数组中删除整行

php - 注册表 php mysql html

php - 提取最后5个产品mysql

yii - PHPDOC @property 关联到 getter

PHPStorm + PHPdoc - 我可以键入提示单个数组元素吗?