我使用 Kohana 框架,它允许多个类定义(在应用程序和系统子文件夹中)。我使用 phpstorm 作为 IDE,它为我提供消息 multiple definitions exist for class。有没有办法告诉 phpStorm 哪个类定义是正确的?
multiple definitions exist for class
有没有办法告诉 PhpStorm 哪个类的定义是正确的?
很不幸,你不能。
Https://youtrack.jetbrains.com/issue/wi-17646 ——查看这张票(星号/投票/评论)以获得任何进展的通知。
自动取款机,你要么就忽略下挥手。.或者您可以将检查配置为不报告此类情况(Settings/Preferences | Editor | Inspections | PHP | Undefined | Undefined class,它有 Don't report multiple class declaration potential problems复选框)。
Settings/Preferences | Editor | Inspections | PHP | Undefined | Undefined class
Don't report multiple class declaration potential problems
即使配置了检查,IDE 仍然会询问要跳转到哪个类声明(这是正确的行为,因为 IDE 不知道您是想看到原始实现还是实现自己的实现)。
唯一的其他方法是确保项目中只有一个具有相同名称的类。为此,你可以使用:
两者都可以通过项目视图中的内容菜单获得,并且只适用于项目文件(例如,将不可用,或者如果尝试应用于库范围,则不会做任何有用的事情)。
我已经找到了一个可能的解决办法,我的问题-我可以 mark file as plain
mark file as plain
作为变量,您可以只对特定类关闭检查。将光标放入下摆类名中,然后 Alt+Enter→ Inspection options→ Supress for statement
Alt+Enter
Inspection options
Supress 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 搞不清楚哪个扩展文件夹是正确的。 我已经删除了额外的供应商文件夹,它解决了问题。
现在的方法是,至少在 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来指定我实际上要使用的类。
use
然后在我的代码中搜索“@nocheck PhpUnDefinition edClassInspection”。
上面的问题源于这样一个事实,即我有一个“ master”Customer 类,它被 Foobar客户机的“ local”修改所覆盖,这个客户机有(比方说)一个特殊的方法。
这样做的“正确”方法应该是声明一个 FoobarCustomer,它只被 foobar 的代码使用,并且是 Customer 的子类。而且我可能需要在父类中的一些方法是 protected而不是 private,这可能使得这个解决方案不可能或者需要 反射:
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()
考虑一下
class_alias( 'The\AliasClass', 'My\RealClass', true );
还有
class_alias( 'The\AliasClass', 'My\Real'.'Class', // <-- break up the string true );
使用后者,PhpStorm 将不会接收到 My\RealClass,并且您的“多重定义”警告将停止。顺便说一下,这是一个古老的 JavaScript 技巧,可以将 HTML 嵌入到字符串文字中。
My\RealClass
我已经在网络的各个地方,没有一个选项适合我... 我已经挣扎了几个月,今天我找到了一个解决方案,所以如果以上没有一个适合你,尝试重新定义 PHP 包含路径列表。在“设置”> “语言和框架”> PHP 下,确保只配置包含项目或应用程序所使用的源路径的文件夹。
我的场景是我做了很多软件包开发,虽然我的软件包都在一个项目中,但是在我的作曲家配置中,它们也在“供应商”中“符号链接”,所以 PHPStorm 在供应商文件夹和我的软件包文件夹中找到了重复的代码。类似地,如果包含路径被复制,或者路径被配置为在项目之外(已经是项目的一部分)找到代码,那么它也会找到多个定义。因此,排除供应商中的符号链接文件夹,允许 PHPStorm 只能在我的软件包中找到源代码的一个副本,如果我的软件包包含自己的供应商文件夹,它们也会显示为重复的定义。删除“包含路径”列表中可能发现复杂之处的任何内容
看来有几种方法可以解决这个问题。实际上,这只是一个警告,它说 phpstorm 不能提供自动完成,所以你必须更加努力一点: D
我和这里的许多人有同样的问题,并且通过忽略不想要的东西来解决它。
在编写器安装之后,有一个带有供应商文件夹的 git 项目。此外,有一个 my-project.phar在这个项目,也包含一些供应商的东西,这导致了我的警告。
my-project.phar
File > Preferences|Settings > Directories 在那里您必须排除文件和文件夹的可能性。在我的例子中,它是 .phar,所以它是 “文件”,你可以在设置窗口的底部添加它。
File > Preferences|Settings > Directories
.phar
PHPStorm 将不再看到副本。
这是非常具体的项目,我想大多数人必须找到自己的解决方案,但指出这可能有助于找到问题更容易。
希望这对某些人有所帮助:)
这只是对安迪 · 怀特评论的一些补充:
设置 | 编辑器 | 检查 | PHP | 未定义 | 未定义类 | 不要报告多个类声明潜在的问题
我实在找不到这个配置,以为它现在已经不存在了,但是它仍然存在,但是隐藏得很好)
这有点违反直觉,也不太显眼,但所需的复选框在右侧面板中,只有当你点击 Undefined class行时才会出现:
Undefined class
尝试删除重复声明的库
设置-> 语言及框架-> PHP-> 包含路径