类有多种定义


69

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

Answers:


96

有什么办法告诉PhpStorm哪个类定义正确?

不幸的是,您不能。

https://youtrack.jetbrains.com/issue/WI-17646-观看这张票(star / vote / comment)以获得任何进展的通知。

您可以忽略自动柜员机,也可以将检查配置为不报告此类情况(Settings/Preferences | Editor | Inspections | PHP | Undefined | Undefined class带有Don't report multiple class declaration potential problems复选框)。

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


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

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

两者都可以通过“项目视图”中的内容菜单使用,并且仅适用于项目文件(例如,将不可用,或者如果尝试在“库”范围中应用,则无用)。


自动建议功能如何?当一个类有多个定义时,它也不起作用。
Meglio

2
@Meglio是的-这就是IDE的行为-如果多个具有相同名称的类表现得很奇怪。最好的-从项目中排除重复项-整个文件夹(标记为已排除)或单个文件(标记为纯文本)。我想youtrack.jetbrains.com/issue/WI-17646将是观看之后的正确门票……
LazyOne

8
对于PhpStorm 2018,选项位于Settings | Editor | Inspections | PHP | Undefined | Undefined class | Don't report multiple class declaration potential problems
Andy White

@AndyWhite删除信息根本无法解决问题,只是将其隐藏。在某些情况下,自动完成功能不起作用,因此唯一发生的事情就是您对这种行为无所适从。您应该找到重复的文件/文件夹,并在项目设置中忽略它们。请参阅我的帖子。顺便说一句,他收到了您在他的帖子中已经说过的这些信息。:)
Dwza

30

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

  • 转到设置>目录
  • 选择 var\cache
  • 将其设置为“已排除”

来自:https : //github.com/Haehnchen/idea-php-symfony2-plugin/issues/301


1
像symfony3一样(提供链接的人说),自动完成服务将不再起作用
Remy Mellet

1
使用Symfony,我可以同时在应用程序和库中工作。分别称它们为projectp1p2p2可从符号链接projects/p2projects/p1/vendors/xavi-montero/p2通过符号链接访问。在p1自动完成中编辑某些类(例如Symfony Controller)时,该方法不起作用。原因:两家都安装了供应商,因此发生冲突。我只是排除在外projects/p1/vendor/xavi-montero/p2/vendor。现在,我可以从p2编辑时自动完成我自己的类,p1但是由于“第二”个供应商被忽略而“第一”不被排除,因此冲突消失了。
哈维·蒙特罗

如果作曲家将本地软件包从开发文件夹链接packages/*public/app/plugins/*文件夹,则此解决方案非常有效。
Moongazer

20

我找到了解决问题的可能方法-我可以 mark file as plain


是的,我认为这是PHPStorm中的错误。运行PhpStorm 8,我的软件正在查看来自其他项目的类引用,这就是为什么存在多个定义的原因。我删除了旧项目,错误消失了。
Acyra 2014年

@Acyra,不,PHPStorm 8中的行为相同。–
Max Koretskyi

11
那甚至不是一个解决方案。您如何期望代码完成或提示等。如果您真的不需要它,请停止使用IDE ...开始使用记事本。
伊扎尔·阿兹米(Izhar Aazmi)2016年

2
这是一个解决方案,但到目前为止,最糟糕的解决方案是。库巴的建议有效。
Jimbo

1
这对我来说是最好的解决方案。如果我排除具有重复的模拟类定义的测试目录,则无法完全grep intellij中的代码库,并且会丢失排除目录中的事物实例。最好将文件标记为文本,这样它仍然可以被intellij索引和搜索,然后在必要时将其标记为源代码。它仍然不会被视为源,但至少会被抓获。必须使用grep来重构PHP。
戴维·曼

13

作为变体,您只能针对特定类别关闭检查。underwaved类名里面把光标,然后Alt+Enter→交通Inspection options→交通Supress for statement

PHPStorm添加

/** @noinspection PhpUndefinedClassInspection */

上面的类声明和类名称不再被削弱。


2
感谢您的解决方案
Max Koretskyi 2014年

可行,但这是一个丑陋的解决方案。无处不在的注释。
马库斯·泽勒

11

我到处都是网络,没有一个选项对我有用。。。我已经努力了几个月,今天我找到了一个解决方案,因此,如果以上都不适合您,请尝试重新定义PHP包括路径列表。在“设置”>“语言和框架”>“ PHP”下,确保仅配置了包含项目或应用程序使用的源路径的文件夹。

我的情况是我进行了很多软件包开发,尽管我的软件包都在一个项目中,但它们在我的作曲家配置中的“供应商”中也被“符号链接”,因此,PHPStorm在供应商文件夹中找到了重复的代码。和我的包裹文件夹。同样,如果包含路径被复制,或者配置了路径以在您的项目外部(已属于项目的一部分)中查找代码,则它还将查找多个定义。因此,排除供应商中的符号链接文件夹,PHPStorm只能为我的软件包找到源的一个副本,并且如果我的软件包包含自己的供应商文件夹,它们还将显示为重复的定义。删除“包含路径”列表中可能会出现重复的所有内容


2
这对我有所帮助,事实证明我的www项目api同时通过whatever/myproject/api/src和引用了我的项目vendor/myproject/api,这导致大多数类都获得“存在类的多个定义”警告,而不管任何use ...声明如何。让我发疯,直到我仔细观察列出的路径Settings -> Languages and Frameworks -> PHP。删除第一个,然后编辑第二个vendor/myproject/api/src似乎可以解决问题。
Magnus W

1
此解决方案最适合我;我有这个问题,因为Symfony的PHPUnit桥使用符号链接作为phpunit源,因此PHPStorm选择了两个源。我可以通过进入Languages&Frameworks> PHP并仅指定两个PHPUnit文件夹之一作为源来修复它。
Danielle Suurlant

3

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


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嵌入字符串文字中。


2

这个警告使我很烦了。我相信这里的答案是正确的。我收到警告的原因是由于自动完成文件为phpStorm提供了有关如何查找codeIgniter函数的提示。如果您也这样做,这就是某些警告的原因。自动完成文件使phpStorm认为有两个不同的定义。但是,我比自动警告更喜欢自动完成功能,因此我想我必须忍受它们。

这是我指的自动完成功能: IntelliJ IDEA 12未找到CodeIgniter类,引发错误


2

替代品在流行之后仍然有效,但效果却不佳

  • 将您不希望自动完成使用的文件B标记为“普通”或被排除,将文件A保持活动状态:这将禁用文件C中的通知,但也会使自动完成功能不再适用于文件B中的内容。因此,如果您在其他地方使用了B中正确的内容,并且可能想要从自动补全中排除A,那么您将无法做到这一点。
  • 禁用检查:这还将禁用未定义​​的类警告,因此,如果我在任何类名称中进行任何拼写输入,我只会在部署后才发现此错误(或者因为自动完成功能停止对该对象起作用)。
  • “不要报告多个类声明潜在的问题”-这几乎是一件好事,但是我不喜欢忽略“潜在的问题”;如果我创建了一个在其他地方使用了不经意重复的名称的类,该怎么办?当然,我会抓住它的(或者phpunit会的),但是仍然可以

到目前为止我发现的最好的

至少在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”。

另一种方式

上述问题源于以下事实:我有一个“主”客户类,该类被foob​​ar的“本地”修改所覆盖客户端客户的客户具有(例如)一种特殊方法。

执行此操作的“正确”方法应该是声明一个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...

感谢您的回答,但我不再使用PHP。反正upvoted
马克斯Koretskyi

第一点是不正确的。如果您对一个类有多个定义,则自动完成无法正常工作,因为phpstorm不知道要使用哪个文件。如果禁用一个,则自动完成功能将再次起作用,因为phpstom现在知道正确的文件!它确实是最好的解决方案,因为它完全可以完成预期的工作。:)
Dwza

1
@Dwza我很不好意思表达自己,我将修正答案。
LSerni

2

序言

猜猜有几种方法可以解决此问题。实际上,这只是一个警告,它说phpstorm无法为您提供自动补全功能,因此您必须加倍努力:D

我和这里的许多其他人一样有同样的问题,并通过忽略不想要的问题来解决了。


情境

安装Composer之后,有一个带有供应商文件夹的git项目。另外,my-project.phar该项目中还有个还包含一些供应商的东西,这引起了我的警告。


File > Preferences|Settings > Directories 在那里您必须排除文件和文件夹。就我而言,.phar它是一个“文件”,您可以将其添加到设置窗口的底部。

样品

PHPStorm将不再看到重复项。

这是非常特定于项目的,我想大多数人都必须找到自己的解决方案,但是指出这一点可能有助于更轻松地发现问题。

希望这可以帮助某人:)


1

我有类似的问题,这很烦人。我使用的是Yii2框架,最后发现我意外地在项目的根目录(而不是应用程序的根目录)中创建了一个额外的“ vendor”文件夹和composer.json,因此我最终得到了如下警告: phpStorm感到困惑,哪个扩展文件夹是正确的。我删除了多余的供应商文件夹,它解决了问题。


0

在我的情况下,我通过删除composer.json中一个更具体的条目(其中包含另一个更通用的条目的代码)来解决此问题


0

只是安迪·怀特(Andy White)评论的一些补充:

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

我真的找不到此配置,并以为它现在不存在,但是它仍然存在,但是非常好隐藏)

它有点违反直觉和不起眼,但是所需的复选框在右侧面板中,并且仅在单击以下Undefined class行时显示: 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.