Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

Есть ли способ сообщить 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 не знает, хотите ли вы видеть оригинальную реализацию или реализовать свой собственный).


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

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

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

Ответ 3

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

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

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

Ответ 4

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

PHPStorm добавляет

/** @noinspection PhpUndefinedClassInspection */

выше объявления класса и имя класса больше не защищены.

Ответ 5

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

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

Ответ 6

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

Ответ 7

Я не знаю, как вы создали другое определение, но если у вас или у кого есть эта проблема из-за вызова 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 в строковый литерал, кстати.

Ответ 8

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

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

Ответ 9

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

  • пометив файл 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" по всему моему коду.

По-другому

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

"Правильный" способ сделать это должен объявить FoobarCustomer, который используется только кодом foobar и является дочерним классом Customer. Конечно, это возможно только в том случае, если дочерний класс находится в моем коде, а не в фреймворке, а также мне могут понадобиться некоторые методы в родительском классе для protected а не для private, что может сделать это решение невозможным или необходимым для Reflection:

/**
 * 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...

Ответ 10

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

Ответ 11

пролог

Думаю, есть несколько способов решить эту проблему. На самом деле это всего лишь предупреждение, и он говорит, что phpstorm не может предоставить вам автозаполнение, поэтому вам придется работать немного усерднее: D

У меня была та же проблема, что и у многих здесь, и я решил ее, игнорируя нежелательные.


Szenario

Имел проект git с вендор-папкой после установки композитора. Также в этом проекте есть my-project.phar который также содержит некоторые материалы от поставщиков, и это вызвало мои предупреждения.


Решение

File > Preferences|Settings > Directories Там есть возможность исключать файлы и папки. В моем случае это .phar так что это "файл", и вы можете добавить его внизу окна настроек.

sample

PHPStorm больше не будет видеть дубликаты.

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

Надеюсь, это поможет кому-то :)

Ответ 12

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