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?
J'ai trouvé une solution possible à mon problème - je peux mark file as plain
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:
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).
Vous devez simplement ignorer le dossier de cache complet.
var\cache
De: https://github.com/Haehnchen/idea-php-symfony2-plugin/issues/301
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+Enter
→ Inspection options
→ Supress for statement
PHPStorm ajoute
/** @noinspection PhpUndefinedClassInspection */
la déclaration de classe et le nom de classe ci-dessus ne sont plus sous-ondulés.
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
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.
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.
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.
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...
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
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.
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.
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.
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 :)
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.
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