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:
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?
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.
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.
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();
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)
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.
Vous pouvez utiliser une variable dynamique:
$test = 'test';
$chaine = $f->$test(); // no phpStorm flag, & the code works