我使用的Kohana框架允许多个类定义(在应用程序和系统子文件夹中)。我使用phpstorm作为IDE,它为我提供了消息multiple definitions exist for class
。有没有办法告诉phpStorm哪个类定义是正确的?
答案 0 :(得分:75)
有没有办法告诉PhpStorm哪个类定义是正确的?
不幸的是,你不能。
https://youtrack.jetbrains.com/issue/WI-17646 - 观看此机票(星级/投票/评论)以获得有关任何进展的通知。
ATM您只是忽略了挥手......或者您可以将检查配置为不报告此类情况(Settings/Preferences | Editor | Inspections | Undefined | Undefined class | Don't report multiple class declaration potential problems
)。
即使配置了这个检查,IDE仍会询问您要跳转到哪个类声明(这是正确的行为,因为IDE不知道您是否要查看原始实现或实现自己的实现)。
唯一的另一种方法 - 确保项目中只有一个具有相同名称的类:
两者都可以通过项目视图中的内容菜单获得,并且仅适用于项目文件(例如,如果尝试在库范围内应用,将无法使用或无效)。
答案 1 :(得分:25)
您应该忽略完整的缓存文件夹。
var\cache
来自:https://github.com/Haehnchen/idea-php-symfony2-plugin/issues/301
答案 2 :(得分:18)
我找到了解决问题的可能方法 - 我可以mark file as plain
答案 3 :(得分:10)
作为变体,您可以仅针对特定班级关闭检查。将光标放在underwaved类名称中,然后Alt+Enter
→Inspection options
→Supress for statement
PHPStorm添加
/** @noinspection PhpUndefinedClassInspection */
上面的类声明和类名不再是underwaved了。
答案 4 :(得分:6)
我到处都是网络,并没有一个选项对我有用...我已经苦苦挣扎了几个月,今天我找到了解决方案,所以如果以上都不适合你,试试重新定义PHP包含路径列表。在设置>下语言与框架> PHP,确保只配置包含项目或应用程序使用的源路径的文件夹。
我的情况是我做了很多软件包开发,虽然我的软件包都在一个项目中,但在我的作曲家配置中它们也在“vendor”中“符号链接”,因此PHPStorm找到了重复的代码,供应商文件夹和我的包文件夹。同样,如果包含路径重复,或者路径配置为查找项目之外的代码(已经是项目的一部分),它也会找到多个定义。因此,排除供应商中的符号链接文件夹,允许PHPStorm仅查找源的一个副本到我的包,如果我的包包含他们自己的供应商文件夹,它们也将显示为重复的定义。删除包含路径列表中可能找到应用程序的任何内容
答案 5 :(得分:3)
在项目的某个地方,同一个类有多个定义。我发现我的项目中有备份副本导致了这个警告。我从我的项目中删除了备份(无论如何都是一个好主意)并修复了错误。
答案 6 :(得分:3)
我不知道您是如何创建其他定义的,但如果您或任何人因调用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嵌入到字符串文字中。
答案 7 :(得分:2)
这个警告让我很烦恼了很久。我相信这里的答案说有一个重复的文件在某处是正确的。我收到警告的原因是由于自动完成文件给phpStorm提供了如何查找codeIgniter函数的提示。如果你这样做也是一些警告的原因。自动完成文件使phpStorm认为有两种不同的定义。但是,我喜欢自动完成比我不喜欢警告所以我想我必须和他们一起生活。
这是我所指的自动填充: IntelliJ IDEA 12 not finding CodeIgniter classes, throwing errors
答案 8 :(得分:2)
现在的方法,至少在PHPStorm可以使用更集中的配置(例如“替代类”)之前,就是将这些通知 - 只有那些 - 标记为可忽略的:
/* @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标记,例如“@replaces”。所以PHPStorm会知道我的班级是而不是取代的。我还必须装饰我的use
以指定我将实际使用的类。
在我的代码中搜索“@noinspection PhpUndefinedClassInspection”。
上述问题源于这样一个事实,即我有一个“主”客户类,它被 foobar 客户端的“本地”修改所覆盖,客户拥有(比方说)一种特殊方法。
执行此操作的“正确”方法应该是声明FoobarCustomer,它仅由foobar的代码使用,并且是Customer的子类。 当然只有子类在我的代码中,而不在框架的中才有可能,而且我可能需要父类中的某些方法为protected
而不是{{1 }},这可能使这个解决方案不可能或需要Reflection:
private
答案 9 :(得分:1)
我有类似的问题而且非常烦人。我正在使用Yii2框架,结果我最终意外地创建了额外的&#34; vendor&#34;项目根目录中的文件夹和composer.json(不在应用程序的根目录中)所以我最终得到了警告,因为phpStorm混淆了哪个扩展文件夹是正确的。 我删除了额外的供应商文件夹,它解决了问题。
答案 10 :(得分:0)
我在我的情况下解决了这个问题,删除了我的composer.json中一个更具体的条目,其中包含了另一个更通用的条目的代码
答案 11 :(得分:0)
猜猜有几种方法可以解决此问题。实际上,这只是一个警告,它说phpstorm无法为您提供自动补全功能,因此您必须更加努力:D
我和这里的许多人都遇到了同样的问题,并通过忽略不想要的问题解决了这个问题。
在安装作曲家之后,有一个带有供应商文件夹的git项目。该项目中还有一个my-project.phar
,其中也包含一些供应商的东西,这引起了我的警告。
File > Preferences|Settings > Directories
在那里您必须排除文件和文件夹。就我而言,它是.phar
,所以它是“文件” ,您可以将其添加到设置窗口的底部。
PHPStorm将不再看到重复项。
这是非常特定于项目的,我想大多数人都必须找到他们自己的解决方案,但是要指出这是我的帮助,以便更轻松地发现问题。
希望这对某人有帮助:)
答案 12 :(得分:0)
除了安迪·怀特(Andy White)的评论外:
设置|编辑器检验| PHP |未定义未定义的类|不要报告多个类声明潜在的问题
我真的找不到此配置,以为它现在不存在,但是它仍然存在,但是很好隐藏)
答案 13 :(得分:0)