我有一个名为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
课程?
答案 0 :(得分:2)
导入课程时,您可以使用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();
。