web-dev-qa-db-fra.com

Comment traiter l'avertissement "méthode introuvable dans la classe" pour les méthodes mises en œuvre par magie?

Je suis assis sur une base de code volumineuse qui contient plusieurs classes exposant des fonctionnalités par le biais de méthodes mises en œuvre de façon magique (en utilisant __call et __callStatic). Par exemple:

class Foo {
    public function __call($name, $parameters) {
        echo "You called $name().\n";
    }
}

$f = new Foo;
$f->test();   // runs fine, but PhpStorm flags as a warning

Le problème est que PhpStorm pense que la méthode test() n’existe pas, il envoie donc un avertissement sur le site de l’appel. C'est un peu gênant, car bien sûr, le code fonctionnera et se comportera comme prévu.

J'ai déjà réglé la gravité en cochant l'option "Gravité de rétrogradation si les méthodes __magic sont présentes dans la classe", mais je préférerais que:

  1. désactiver complètement cette fonctionnalité pour des classes spécifiques uniquement, ou
  2. travaillez avec IDE plutôt que contre lui - fournissez-lui les informations que j'ai déjà afin que nos points de vue s'accordent

Est-ce que tout ce qui précède est possible? Si c'est le cas, comment?

Question de bonus supplémentaire: considérons le cas où les appels de méthode sont chaînés.

$f = new Foo;
$f->test()->chain()->moreChain();   // potentially runs fine

En supposant que l'appel magique à $f->test() renvoie quelque chose de approprié, les appels suivants (éventuellement, mais pas nécessairement aussi magiques) fonctionneront correctement. Cependant, comme je ne sais pas comment dire à IDE ce que test() renvoie, il marque le reste de la chaîne d'appels comme étant également rempli de méthodes manquantes. Et pour aggraver les choses, le paramètre "Gravité de la mise à niveau inférieure" ne s'applique pas à ces avertissements, car IDE ne sait pas à quelle classe ces objets intermédiaires sont censés appartenir.

Existe-t-il une solution pouvant également couvrir ce cas?

Mettre à jour

Bien que la documentation des méthodes magiques avec les annotations @method semble fonctionner, je dois supposer que cette approche pose actuellement plusieurs problèmes, car il ne m'a fallu qu'un peu de travail pour détecter ces bogues:

J'espère qu'ils les régleront dans un délai raisonnable.

44
Jon

Eh bien, vous pouvez aller dans le menu des préférences, sous Inspections, aller à Undefined -> Undefined Method et vérifier Rétrograder la gravité si __magic est présent .

Cela rendrait le drapeau moins sévère (au lieu de Warning, comme Info), ce qui vous donnerait toujours le feu vert à la vérification de vos documents.

À ma connaissance, il n’ya rien d’autre que des notations PHPDoc @property ou @method sur la classe cible pour chaque méthode susceptible d’être utilisée.

enter image description here

39
Madara Uchiha

Plutôt que de désactiver globalement les inspections en réduisant la gravité de l'inspection, vous pouvez ajouter un commentaire à la ligne pour ignorer cette inspection.

    /** @noinspection PhpUndefinedMethodInspection */
    Assertion::NullOrAssertionDoesNotExist();
20
Richard A Quadling

En me basant sur ce que Madara a dit, j’ai constaté qu’elle ne serait pas dégradée assez loin à mon goût, quelle que soit la sévérité à laquelle je l’ai réglée. J’ai donc créé une nouvelle méthode Severity pour la méthode non définie qui a aucun attribut Désactiver la case à cocher déclasser (voir l'image ci-dessous) 

 enter image description here

Si je survole maintenant mes méthodes magiques, le message contextuel apparaîtra, mais sinon, cela ne me distraira pas. Une étape préférable à la simple désactivation de l'inspection, car au moins cette méthode permet toujours de détecter une méthode non définie en survolant son nom. 

1
daronjay

Vous pouvez utiliser une variable dynamique: 

$test = 'test';
$chaine = $f->$test();   // no phpStorm flag, & the code works
0
Qassoul