类存在多个定义

我使用 Kohana 框架,它允许多个类定义(在应用程序和系统子文件夹中)。我使用 phpstorm 作为 IDE,它为我提供消息 multiple definitions exist for class。有没有办法告诉 phpStorm 哪个类定义是正确的?

64363 次浏览

有没有办法告诉 PhpStorm 哪个类的定义是正确的?

很不幸,你不能。

Https://youtrack.jetbrains.com/issue/wi-17646 ——查看这张票(星号/投票/评论)以获得任何进展的通知。

自动取款机,你要么就忽略下挥手。.或者您可以将检查配置为不报告此类情况(Settings/Preferences | Editor | Inspections | PHP | Undefined | Undefined class,它有 Don't report multiple class declaration potential problems复选框)。

即使配置了检查,IDE 仍然会询问要跳转到哪个类声明(这是正确的行为,因为 IDE 不知道您是想看到原始实现还是实现自己的实现)。


唯一的其他方法是确保项目中只有一个具有相同名称的类。为此,你可以使用:

  • 将整个文件夹标记为已排除
  • 将单个文件标记为纯文本

两者都可以通过项目视图中的内容菜单获得,并且只适用于项目文件(例如,将不可用,或者如果尝试应用于库范围,则不会做任何有用的事情)。

我已经找到了一个可能的解决办法,我的问题-我可以 mark file as plain

作为变量,您可以只对特定类关闭检查。将光标放入下摆类名中,然后 Alt+EnterInspection optionsSupress for statement

PHPStorm 补充道

/** @noinspection PhpUndefinedClassInspection */

以上的类声明和类名称不再是下挥。

您应该忽略完整的缓存文件夹。

  • 进入设置 > 目录
  • 选择 var\cache
  • 设置为“排除”

发信人: https://github.com/Haehnchen/idea-php-symfony2-plugin/issues/301

在项目中的某个地方,同一个类有多个定义。我发现我的项目中有备份副本,这导致了这个警告。我从我的项目中删除了备份(无论如何是个好主意) ,它修复了错误。

这个警告使我烦恼了很长时间。我相信这里的答案说有一个副本文件的地方是正确的。我收到这些警告的原因是,该自动完成文件为 phpStorm 提供了有关如何查找 codeIgniter 函数的提示。如果你也这样做,这就是一些警告的原因。自动完成文件使 phpStorm 认为有两种不同的定义。然而,我更喜欢自动完成,而不是我不喜欢的警告,所以我想我必须生活在他们。

这就是我所说的自动补全: IntelliJ IDEA 12找不到 CodeIgniter 类,抛出错误

我也有过类似的问题,而且相当恼人。我使用 Yii2框架,最后我不小心在项目的根目录(而不是应用的根目录)中创建了一个额外的“供应商”文件夹和 poser.json,所以我得到了这个警告,因为 phpStorm 搞不清楚哪个扩展文件夹是正确的。 我已经删除了额外的供应商文件夹,它解决了问题。

有些替代方案虽然勉强可行,但效果并不理想

  • 将文件 B 标记为您不希望自动完成程序使用的“纯文本”或排除文件,从而使文件 A 处于活动状态: 这将禁用文件 C、 但也将使自动完成不再工作,无论是在文件 B中的通知。所以如果你在其他地方使用了 B 中正确的内容,或者你想把 A 排除在自动补全之外,你不能这么做。
  • 禁用检查: 这也将禁用未定义的类警告,所以如果我在任何类名中输入错误,我只会在部署之后发现(或者根据自动完成停止为该对象工作的事实)。
  • “不要报告多个类声明的潜在问题”——这是非常好的,但是我不喜欢忽略“潜在问题”; 如果我创建了一个在其他地方使用的具有不知不觉重复名称的类怎么办?我承认我会抓住它(或者 phPunit 会) ,但是 还是

目前为止我找到的最好的

现在的方法是,至少在 PHPStorm 有了更集中的配置之前(比如“ Alternative Class”) ,将那些通知——只有那些——标记为可忽略的:

/* @noinspection PhpUndefinedClassInspection */
/**
* Verify an existing contract. Requires agent and supervisor.
*
* @param array   $data
* @param Cliente $cli
* @param User    $age
* @param User    $sup
* @return Contratto
*/
private function contratto(
array $data,
/* @noinspection PhpUndefinedClassInspection */
Cliente $cli,
/* @noinspection PhpUndefinedClassInspection */
User $age,
/* @noinspection PhpUndefinedClassInspection */
User $sup
) {

注意,为了禁用 PHPDoc 注释中的通知,我必须在注释之前添加一个指令; 这个 没有关闭是三个参数的通知。

将来,我希望能够将 PHPStorm 中的那些指定为

 * @param array                 $data    raw data for the contract
* @param \local\foobar\Cliente $cli     customer opening the contract


private function contratto(
array $data,
/*\local\foobar\*/Cliente $cli,

或者更好的做法是,显式地使用一个新的 PHPdoc 标记,比如“@replace”。因此 PHPStorm 会知道我的类是 没有所替代的类。我还必须修饰我的 use来指定我实际上要使用的类。

然后在我的代码中搜索“@nocheck PhpUnDefinition edClassInspection”。

另一种方式

上面的问题源于这样一个事实,即我有一个“ master”Customer 类,它被 Foobar客户机的“ local”修改所覆盖,这个客户机有(比方说)一个特殊的方法。

这样做的“正确”方法应该是声明一个 FoobarCustomer,它只被 foobar 的代码使用,并且是 Customer 的子类。而且我可能需要在父类中的一些方法是 protected而不是 private,这可能使得这个解决方案不可能或者需要 反射:

/**
* Verify an existing contract. Requires agent and supervisor.
*
* @param array         $data
* @param FoobarCliente $cli
* @param FoobarUser    $age
* @param FoobarUser    $sup
* @return Contratto
*/
private function contratto(array $data, FoobarCliente $cli, FoobarUser $age...

在我的例子中,我解决这个问题的方法是删除 comper.json 中的一个更具体的条目,该条目由另一个更一般的条目包含代码

我不知道您是如何创建另一个定义的,但是如果您或任何人因为调用 class_alias()而遇到这个问题,那么您可以快速解决这个问题。

考虑一下

class_alias(
'The\AliasClass',
'My\RealClass',
true
);

还有

class_alias(
'The\AliasClass',
'My\Real'.'Class', // <-- break up the string
true
);

使用后者,PhpStorm 将不会接收到 My\RealClass,并且您的“多重定义”警告将停止。顺便说一下,这是一个古老的 JavaScript 技巧,可以将 HTML 嵌入到字符串文字中。

我已经在网络的各个地方,没有一个选项适合我... 我已经挣扎了几个月,今天我找到了一个解决方案,所以如果以上没有一个适合你,尝试重新定义 PHP 包含路径列表。在“设置”> “语言和框架”> PHP 下,确保只配置包含项目或应用程序所使用的源路径的文件夹。

我的场景是我做了很多软件包开发,虽然我的软件包都在一个项目中,但是在我的作曲家配置中,它们也在“供应商”中“符号链接”,所以 PHPStorm 在供应商文件夹和我的软件包文件夹中找到了重复的代码。类似地,如果包含路径被复制,或者路径被配置为在项目之外(已经是项目的一部分)找到代码,那么它也会找到多个定义。因此,排除供应商中的符号链接文件夹,允许 PHPStorm 只能在我的软件包中找到源代码的一个副本,如果我的软件包包含自己的供应商文件夹,它们也会显示为重复的定义。删除“包含路径”列表中可能发现复杂之处的任何内容

Prolog

看来有几种方法可以解决这个问题。实际上,这只是一个警告,它说 phpstorm 不能提供自动完成,所以你必须更加努力一点: D

我和这里的许多人有同样的问题,并且通过忽略不想要的东西来解决它。


场景

在编写器安装之后,有一个带有供应商文件夹的 git 项目。此外,有一个 my-project.phar在这个项目,也包含一些供应商的东西,这导致了我的警告。


解决方案

File > Preferences|Settings > Directories 在那里您必须排除文件和文件夹的可能性。在我的例子中,它是 .phar,所以它是 “文件”,你可以在设置窗口的底部添加它。

sample

PHPStorm 将不再看到副本。

这是非常具体的项目,我想大多数人必须找到自己的解决方案,但指出这可能有助于找到问题更容易。

希望这对某些人有所帮助:)

这只是对安迪 · 怀特评论的一些补充:

设置 | 编辑器 | 检查 | PHP | 未定义 | 未定义类 | 不要报告多个类声明潜在的问题

我实在找不到这个配置,以为它现在已经不存在了,但是它仍然存在,但是隐藏得很好)

这有点违反直觉,也不太显眼,但所需的复选框在右侧面板中,只有当你点击 Undefined class行时才会出现: enter image description here

尝试删除重复声明的库

设置-> 语言及框架-> PHP-> 包含路径

enter image description here