web-dev-qa-db-fra.com

plusieurs définitions existent pour la classe

J'utilise le framework Kohana qui permet plusieurs définitions de classe (dans les sous-dossiers d'application et de système). J'utilise phpstorm comme un IDE qui me donne des messages multiple definitions exist for class. Existe-t-il un moyen de dire à phpStorm quelle définition de classe est correcte?

56

J'ai trouvé une solution possible à mon problème - je peux mark file as plain

19

Existe-t-il un moyen de dire à PhpStorm quelle définition de classe est correcte?

Vous ne pouvez malheureusement pas.

https://youtrack.jetbrains.com/issue/WI-17646 - regardez ce ticket (étoile/vote/commentaire) pour être informé de tout progrès.

ATM, vous pouvez soit ignorer la sous-ondulation .. soit vous pouvez configurer cette inspection pour ne pas signaler de tels cas (Settings/Preferences | Editor | Inspections | Undefined | Undefined class | Don't report multiple class declaration potential problems).

Même avec cette inspection configurée, IDE vous demandera toujours à quelle déclaration de classe aller (et c'est un comportement correct comme IDE ne sait pas si vous voulez pour voir l'implémentation d'origine ou implémenter la vôtre).


La seule autre façon - assurez-vous qu'il n'y a qu'une seule classe avec le même nom dans le projet:

  • Marquer le dossier entier comme exclu
  • Marquer un fichier individuel comme texte brut

Les deux sont disponibles via le menu de contenu dans la vue du projet et s'appliquent uniquement aux fichiers de projet (par exemple, ne seront pas disponibles ou ne feront rien d'utile si vous essayez de les appliquer dans la portée de la bibliothèque).

80
LazyOne

Vous devez simplement ignorer le dossier de cache complet.

  • Accédez à Paramètres> Répertoires
  • Choisissez var\cache
  • Réglez-le sur "Exclus"

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

26
kuba

En variante, vous pouvez désactiver l'inspection uniquement pour une classe spécifique. Placez le curseur dans le nom de classe sous-ondulé, puis Alt+EnterInspection optionsSupress for statement

PHPStorm ajoute

/** @noinspection PhpUndefinedClassInspection */

la déclaration de classe et le nom de classe ci-dessus ne sont plus sous-ondulés.

11
Maug Lee

J'ai parcouru le Web partout et aucune option n'a fonctionné pour moi ... Je me bats depuis des mois avec elle, et aujourd'hui j'ai trouvé une solution, donc si aucune des solutions ci-dessus ne vous convient, essayez de redéfinir le = PHP Inclure la liste des chemins d'accès. Sous Paramètres> Langues et cadres> PHP, assurez-vous que seuls les dossiers contenant les chemins d'accès à la source utilisés par votre projet ou application sont configurés.

Mon scénario est que je fais beaucoup de développement de packages, et bien que mes packages soient tous dans un projet, ils sont également "liés par un lien" dans "vendeur" dans ma configuration composer, donc il y a duplication code trouvé par PHPStorm, dans le dossier du fournisseur et dans le dossier mes packages. De même, si les chemins d'inclusion sont dupliqués ou si les chemins sont configurés pour rechercher du code en dehors de votre projet, qui fait déjà partie du projet, il trouvera également plusieurs définitions. , à l'exclusion des dossiers liés par lien dans le fournisseur, permet à PHPStorm de ne trouver qu'une seule copie de la source dans mes packages, et si mes packages contiennent leurs propres dossiers, ils s'afficheront également en tant que définitions dupliquées. Supprimez tout dans la liste Inclure le chemin où il peut trouver une dipplication

7
PipIWYG

Quelque part dans votre projet, il existe plusieurs définitions pour la même classe. J'ai découvert que j'avais des copies de sauvegarde dans mon projet, ce qui a provoqué cet avertissement. J'ai supprimé les sauvegardes de mon projet (une bonne idée de toute façon) et cela a corrigé l'erreur.

3
patrick

Je ne sais pas comment vous avez créé l'autre définition, mais si vous ou quelqu'un d'autre a ce problème en raison de l'appel de class_alias(), vous pouvez résoudre ce problème rapidement.

Considérer

class_alias(
    'The\AliasClass',
    'My\RealClass',
    true
);

et

class_alias(
    'The\AliasClass',
    'My\Real'.'Class', // <-- break up the string
    true
);

Avec ce dernier, PhpStorm ne ramassera pas le My\RealClass et votre avertissement "définition multiple" cessera. C'est une ancienne astuce JavaScript pour incorporer du HTML dans un littéral de chaîne, soit dit en passant.

3
Drakes

Des alternatives qui fonctionnent à la mode, mais qui ne sont pas si bonnes

  • marquer le fichier B que vous ne voulez pas utiliser comme saisie semi-automatique comme "simple" ou exclu, laissant le fichier A actif: cela désactivera les notifications dans le fichier C, mais rendra également la saisie semi-automatique non travailler plus longtemps pour tout ce qui est dans le fichier B . Donc, si ailleurs vous utilisez quelque chose qui est correctement en B, et peut-être que vous voulez exclure A de la saisie semi-automatique, vous ne pouvez pas le faire.
  • désactiver l'inspection: cela désactivera également les avertissements de classe non définis, donc si je fais des fautes de frappe dans n'importe quel nom de classe, je ne le découvrirai qu'après le déploiement (ou du fait que la saisie semi-automatique cesse de fonctionner pour cet objet).
  • "Ne signalez pas les problèmes potentiels de déclaration de classe multiple" - c'est très bien, mais je n'aime pas ignorer les "problèmes potentiels"; que faire si je crée une classe avec un nom dupliqué sans le savoir qui est utilisé ailleurs? Certes, je vais l'attraper (ou phpunit le fera), mais encore.

Le meilleur que j'ai trouvé jusqu'à présent

La voie à suivre pour le moment, du moins jusqu'à ce qu'une configuration plus ciblée soit disponible pour PHPStorm (par exemple, "Classes alternatives"), consiste à marquer ces notifications - et seulement celles-ci - comme ignorables:

/* @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
) {

Notez que pour désactiver les notifications dans le commentaire PHPDoc, j'ai dû ajouter une directive avant le commentaire; cela n'a pas désactivé les notifications pour les trois paramètres.

À l'avenir, je souhaite pouvoir spécifier ceux de PHPStorm comme

 * @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,

ou mieux encore, utilisez explicitement une nouvelle balise PHPdoc telle que "@replaces". Donc PHPStorm saurait que ma classe est celle pas remplacée. Je devrai également décorer mes use pour spécifier la classe que j'utiliserai réellement.

Et lancez une recherche pour "@noinspection PhpUndefinedClassInspection" dans tout mon code.

Autrement

Les problèmes ci-dessus proviennent du fait que j'ai une classe Client "maître" qui est remplacée par une modification "locale" pour le client foobar, dont les Clients ont (disons) une méthode spéciale.

La manière "correcte" de procéder doit être de déclarer un client Foobar qui n'est employé que par le code de foobar et qui est une classe enfant du client. Bien sûr, cela n'est possible que si la classe enfant est dans mon code, pas dans le framework , et aussi j'ai peut-être besoin de quelques méthodes dans la classe parent pour être protected plutôt que private, ce qui peut rendre cette solution impossible ou nécessitant Réflexion :

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

Cet avertissement m'agace depuis longtemps. Je crois que les réponses ici disant qu'il y a un fichier en double quelque part sont correctes. La raison pour laquelle je reçois les avertissements est due au fichier de saisie semi-automatique pour donner à phpStorm un indice sur la façon de trouver les fonctions de codeIgniter. Si vous faites cela également, c'est la raison de certains des avertissements. Le fichier de saisie semi-automatique fait penser à phpStorm qu'il existe deux définitions différentes. Cependant, j'aime la saisie semi-automatique plus que je n'aime pas les avertissements, donc je suppose que je dois vivre avec eux.

Voici la saisie semi-automatique à laquelle je fais référence: IntelliJ IDEA 12 ne trouvant pas les classes CodeIgniter, lançant des erreurs

2
Tim Duncklee

Prolog

Je suppose qu'il existe plusieurs façons de résoudre ce problème. En fait, c'est juste un avertissement et il dit que phpstorm ne peut pas vous fournir d'auto-complétion, vous devez donc travailler un peu plus dur: D

J'ai eu le même problème que beaucoup d'autres ici et l'ai résolu en ignorant les indésirables.


Szenario

Avait un projet git avec un dossier fournisseur après composer install. Il y a aussi un my-project.phar dans ce projet qui contient également des informations sur les fournisseurs, ce qui a provoqué mes avertissements.


Solution

File > Preferences|Settings > Directories Là, vous avez la possibilité d'exclure des fichiers et des dossiers. Dans mon cas, c'est le .phar c'est donc un "fichier" et vous pouvez l'ajouter en bas de la fenêtre des paramètres.

sample

PHPStorm ne verra plus de doublons.

Ceci est très spécifique au projet et j'imagine que les gens doivent trouver leur propre solution, mais en indiquant cela, mon aide pour trouver le problème plus facilement.

J'espère que cela aide quelqu'un :)

1
Dwza

J'ai eu un problème similaire et c'était assez ennuyeux. J'utilisais le framework Yii2 et comme il s'est avéré à la fin, j'ai créé accidentellement un dossier "vendor" supplémentaire et composer.json à la racine du projet (pas à la racine de l'application), donc je me suis retrouvé avec cet avertissement comme phpStorm a été confus quel dossier d'extension est le bon. J'ai supprimé le dossier fournisseur supplémentaire et cela a résolu le problème.

1
Gawran

J'ai résolu ce problème dans mon cas en supprimant une entrée plus spécifique dans mon composer.json qui comprenait du code par une autre entrée plus générale

0
David Lefkon