提示重叠类型的 PHPDoc 类型
PHPDoc type hinting overlapping types
我有一个名为 Resource
的 class,但具有完全限定的名称,例如 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
class 而不是我自己的 Resource
class.
如果我更改 PHPDoc 和函数定义以使用完全限定名称,那么之前的警告就会消失,但我会收到一条小警告,上面写着 Unnecessary fully qualified name.
我想一个解决方案是是使用完全限定名称并禁用次要警告,但我宁愿不必在所有地方都使用完全限定名称。我知道创建与内置类型同名的 class 是我自己的错,但我想知道是否有办法使这项工作正常进行?除了重命名我的 Resource
class?
您可以在导入 class 时使用 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);
您还可以指定整个命名空间和 class 名称,而不仅仅是 class 名称。 示例:
/**
* 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);
如果您在命名空间中并使用此方法,请确保在完整的 class 名称说明符(例如 $x = new \com.example\objects\Resource();
)上使用前导 \
。
我有一个名为 Resource
的 class,但具有完全限定的名称,例如 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
class 而不是我自己的 Resource
class.
如果我更改 PHPDoc 和函数定义以使用完全限定名称,那么之前的警告就会消失,但我会收到一条小警告,上面写着 Unnecessary fully qualified name.
我想一个解决方案是是使用完全限定名称并禁用次要警告,但我宁愿不必在所有地方都使用完全限定名称。我知道创建与内置类型同名的 class 是我自己的错,但我想知道是否有办法使这项工作正常进行?除了重命名我的 Resource
class?
您可以在导入 class 时使用 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);
您还可以指定整个命名空间和 class 名称,而不仅仅是 class 名称。 示例:
/**
* 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);
如果您在命名空间中并使用此方法,请确保在完整的 class 名称说明符(例如 $x = new \com.example\objects\Resource();
)上使用前导 \
。