PHPDoc 类型提示重叠类型
Posted
技术标签:
【中文标题】PHPDoc 类型提示重叠类型【英文标题】:PHPDoc type hinting overlapping types 【发布时间】:2016-08-30 06:11:11 【问题描述】:我有一个名为 Resource
的类,但具有像 com.example/objects/Resource
这样的完全限定名称
如果我写一个文件
use com.example/objects/Resource;
/**
* Do something
*
* @param Resource $r
*/
function myfunc( Resource $r )
$r->something();
$x = new Resource();
myfunc($x);
然后一切正常。由于我的 use
语句,php 类型提示能够处理我已经传递了 com.example/objects/Resource
类型的变量这一事实,即使 myfunc 仅与 Resource
进行比较
问题是 PHPStorm 无法处理这个问题。我无法使用自动完成功能,并且在myfunc($x)
上收到一条警告,上面写着Expected Resource, got Resource
,在函数中收到一条警告,上面写着Method 'something' not found in the class Resource
。显然 PHPStorm 假设我使用的是内置的 resource
类,而不是我自己的 Resource
类。
如果我将 PHPDoc 和函数定义更改为使用完全限定名称,那么之前的警告就会消失,但我会收到一个小警告,上面写着 Unnecessary fully qualified name.
我想一种解决方案是使用完全限定名称并禁用次要警告,但我宁愿不必在任何地方都使用完全限定的名称。我知道创建一个与内置类型同名的类是我自己的错,但我想知道是否有任何方法可以使这项工作?除了重命名我的Resource
类?
【问题讨论】:
使用别名。例如use com.example/objects/Resource as MyResource;
在命名空间中使用“\”而不是“/”^^.
【参考方案1】:
您可以在导入类时使用alias
。更多信息可以找到here。 例子:
use com.example\objects\Resource as MyResource;
/**
* Do something
*
* @param MyResource $r
*/
function myfunc( MyResource $r )
$r->something();
$x = new MyResource();
myfunc($x);
您还可以指定整个命名空间和类名,而不仅仅是类名。 例子:
/**
* Do something
*
* @param com.example\objects\Resource $r
*/
function myfunc( com.example\objects\Resource $r )
$r->something();
$x = new com.example\objects\Resource();
myfunc($x);
如果您在命名空间中并使用此方法,请确保在您的完整类名说明符上使用前导 \
(例如 $x = new \com.example\objects\Resource();
)。
【讨论】:
以上是关于PHPDoc 类型提示重叠类型的主要内容,如果未能解决你的问题,请参考以下文章
声明类型提示时,PhpStorm 是不是允许跳过 PHPDoc 标记?
PhpStorm - 有没有办法将 PHPDoc 转换为类型提示并返回类型声明?
如何使用 PHPDoc 对 Callable 的参数进行类型提示?