PHPDoc类型提示重叠类型

时间:2016-05-04 17:04:21

标签: php phpstorm phpdoc jetbrains-ide type-hinting

我有一个名为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课程?

1 个答案:

答案 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();