繁体   English   中英

PHPDoc类型提示重叠类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM