【问题标题】:PHPDoc type hinting overlapping typesPHPDoc 类型提示重叠类型
【发布时间】:2016-08-30 06:11:11
【问题描述】:

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

【问题讨论】:

  • 使用别名。例如use com.example/objects/Resource as MyResource;
  • 在命名空间中使用“\”而不是“/”^^.

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


【解决方案1】:

您可以在导入类时使用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();)。

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 2010-10-21
    • 2014-08-15
    • 2018-01-20
    • 2011-01-01
    • 2016-01-27
    • 2015-02-01
    • 2021-03-01
    相关资源
    最近更新 更多