[英]PHPDoc type hinting overlapping types
我有一个名为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
语句,即使myfunc仅与Resource
进行了比较,PHP typehinting仍能够处理我已经传递了com.example/objects/Resource
类型的变量的事实。
问题是PHPStorm无法处理此问题。 我无法使用自动完成功能,并且在myfunc($x)
上收到警告,提示Expected Resource, got Resource
在功能内Expected Resource, got Resource
和警告,提示在Method 'something' not found in the class Resource
。 显然,PHPStorm假设我使用的是内置resource
类,而不是我自己的Resource
类。
如果我将PHPDoc和函数定义更改为使用完全限定名称,则前面的警告会消失,但是会出现一条次要警告,提示Unnecessary fully qualified name.
我想一种解决方案是使用完全限定的名称并禁用次要警告,但是我宁愿不必在任何地方都使用完全限定的名称。 我知道创建与内置类型同名的类是我自己的错,但是我想知道是否还有其他方法可以使这项工作成功? 除了重命名我的Resource
类?
导入类时,可以使用alias
。 可以在此处找到更多信息。 例:
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();
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.