для класса существует несколько определений


Я использую фреймворк Kohana, который позволяет использовать несколько определений классов (в подпапках приложений и систем). Я использую phpstorm в качестве IDE, которая выдает мне сообщения multiple definitions exist for class. Есть ли какой-нибудь способ сообщить PhpStorm, какое определение класса является правильным?

 42
Author: Max Wizard K, 2014-04-14

11 answers

Есть ли какой-нибудь способ сообщить PhpStorm, какое определение класса является правильным?

К сожалению, вы не можете.

Https://youtrack.jetbrains.com/issue/WI-17646 -- посмотрите этот билет (звезда/голосование/комментарий), чтобы получать уведомления о любом прогрессе.

Банкомат вы либо просто игнорируете размахивание.., либо вы можете настроить эту проверку, чтобы не сообщать о таких случаях (Settings/Preferences | Editor | Inspections | Undefined | Undefined class | Don't report multiple class declaration potential problems).

Даже с настроенной проверкой IDE все равно спросит вас, к какому классу объявление, к которому нужно перейти (и это правильное поведение, так как IDE не знает, хотите ли вы увидеть оригинальную реализацию или реализовать свою собственную).


Единственный другой способ - убедиться, что в проекте есть только один класс с таким же именем:

  • Пометить всю папку как исключенную
  • Пометить отдельный файл как обычный текст

Оба доступны через меню содержимого в Представлении проекта и применимы только к файлам проекта (например, будут недоступны или будут ничего полезного, если пытается применить в области библиотеки).

 57
Author: LazyOne, 2017-04-21 11:32:59

Вы должны просто игнорировать полную папку кэша.

  • Перейдите в Настройки > Каталоги
  • Выберите var\cache
  • Установите для него значение "Исключено"

От: https://github.com/Haehnchen/idea-php-symfony2-plugin/issues/301

 21
Author: kuba, 2016-06-18 12:48:31

Я нашел возможное решение своей проблемы - я могу mark file as plain

 15
Author: Max Wizard K, 2014-04-18 15:52:38

В качестве варианта вы можете отключить проверку только для определенного класса. Поместите курсор внутрь имени класса с подстрочником, затем Alt+EnterInspection optionsSupress for statement

PhpStorm добавляет

/** @noinspection PhpUndefinedClassInspection */

Приведенное выше объявление класса и имя класса больше не сохраняются.

 7
Author: Maug Lee, 2014-10-26 11:59:40

Я везде побывал в Интернете, и ни один вариант не сработал для меня... Я месяцами боролся с этим, и сегодня я нашел решение, поэтому, если ничего из вышеперечисленного не работает для вас, попробуйте переопределить список путей включения PHP. в разделе Настройки > Языки и фреймворки > PHP убедитесь, что настроены только папки, содержащие пути к источнику, используемому вашим проектом или приложением.

Мой сценарий заключается в том, что я много занимаюсь разработкой пакетов, и пока все мои пакеты находятся в одном проект, они также "символически связаны" в "поставщике" в моей конфигурации композитора, поэтому в папке поставщика и папке "мои пакеты" есть дублированный код, найденный PhpStorm. Аналогично, если пути включения дублируются или пути настроены для поиска кода за пределами вашего проекта, который уже является частью проекта, он также найдет несколько определений. Таким образом, исключение папок с символическими ссылками в поставщике позволяет PhpStorm находить только одну копию источника в моих пакетах, и если мои пакеты содержат собственные папки поставщиков, они также будут отображаться как дублированные определения. Удалите все, что находится в списке "Включить путь", где он может найти отклонение

 4
Author: PipIWYG, 2018-01-21 10:44:43

Где-то в вашем проекте есть несколько определений для одного и того же класса. Я обнаружил, что в моем проекте есть резервные копии, что вызвало это предупреждение. Я удалил резервные копии из своего проекта (в любом случае, хорошая идея), и это исправило ошибку.

 2
Author: patrick, 2015-11-24 13:39:13

Это предупреждение уже давно раздражает меня. Я считаю, что ответы здесь о том, что где-то есть дубликат файла, верны. Причина, по которой я получаю предупреждения, связана с файлом автозаполнения, чтобы дать PhpStorm подсказку о том, как найти функции CodeIgniter. Если вы делаете это также, это является причиной некоторых предупреждений. Файл автозаполнения заставляет PhpStorm думать, что существуют два разных определения. Тем не менее, мне нравится автозаполнение больше, чем мне не нравятся предупреждения, поэтому я думаю, что придется с ними жить.

Это автозаполнение, о котором я говорю: IntelliJ IDEA 12 не находит классы CodeIgniter, выдает ошибки

 2
Author: Tim Duncklee, 2017-05-23 12:10:10

Альтернативы, которые работают по-своему, но не так хороши

  • пометка файла как "обычного" или исключенного: это отключит уведомления , но также приведет к тому, что автозаполнение больше не будет работать , по крайней мере, для всех классов, кроме одного.
  • отключить проверку: это также отключит предупреждения неопределенного класса, поэтому, если я сделаю какие-либо опечатки в любом имени класса, я обнаружу это только после развертывания (или из-за того, что автозаполнение перестает работать для этого объект).
  • "Не сообщайте о потенциальных проблемах с объявлением нескольких классов" - это почти хорошо, но мне не нравится, когда игнорируются "потенциальные проблемы"; что, если я создам класс с непреднамеренно дублированным именем, которое используется где-то еще? Конечно, я поймаю это (или это сделает 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, такой как "@заменяет". Так что PhpStorm знал бы, что мой класс - единственный не заменено. Мне также придется украсить свои use, чтобы указать класс, который я буду фактически использовать.

И запустите поиск "@noinspection PhpUndefinedClassInspection" по всему моему коду.

Другой способ

Вышеуказанные проблемы проистекают из того факта, что у меня есть "главный" класс клиентов, который переопределяется "локальной" модификацией для клиента foobar, у клиентов которого есть (скажем) специальный метод.

"Правильный" способ сделать это должен следует объявить 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...
 2
Author: LSerni, 2017-03-05 17:37:21

Я не знаю, как вы создали другое определение, но если у вас или у кого-либо возникла эта проблема из-за вызова 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
Author: Drakes, 2017-09-25 02:29:44

У меня была похожая проблема, и она была довольно раздражающей. Я использовал фреймворк Yii2, и, как оказалось в конце, я случайно создал дополнительную папку "поставщик" и composer.json в корне проекта (не в корне приложения), поэтому я получил это предупреждение, так как PhpStorm перепутал, какая папка расширения является правильной. Я удалил дополнительную папку поставщика, и это решило проблему.

 1
Author: Gawran, 2016-09-08 20:06:13

Я решил эту проблему в своем случае, удалив более конкретную запись в файле composer.json, которая включала код, с помощью другой более общей записи

 0
Author: David Lefkon, 2017-07-10 17:53:00