web-dev-qa-db-fra.com

Comment documenter les méthodes magiques (__call et __callStatic) pour les IDE

Après de nombreuses années heureuses de codage dans notepad ++ et sublime, on m'a conseillé de donner un PHP IDE un go. J'essaie phpStorm et il semble Bien. La complétion du code et la documentation sont une excellente fonctionnalité mais ne fonctionnent pas pour moi lorsque des méthodes magiques sont utilisées. Y a-t-il un moyen de faire en sorte que phpStorm comprenne ce qui se passe dans les méthodes magiques?

Notre situation ressemble à ceci:

abstract class a {
    public static function __callStatic($method,$args)
    {
        if(strpos($method,"get_by_") === 0)
        {
            //do stuff
        } elseif(strpos($method,"get_first_by_") === 0) {
            //do stuff
        } elseif($method == "get_all") {
            //do stuff
        }
    }
}

class b extends a {
    // some more stuff
}

b::get_by_user_id(27);
b::get_first_by_id(156);
b::get_all();

La méthode magique callStatic nous permet d'obtenir une collection d'objets via 1 ou plusieurs arguments qui composent l'appel de fonction.

Je vois qu'il existe une instruction @method à utiliser dans ces cas, mais phpStorm ne reprend que la première de ces instructions. De plus, je ne peux que définir le type de retour sur mixed où je préfère pouvoir le définir comme n'importe quelle classe à laquelle cela a été appelé (b dans mon exemple).

Toutes les idées ou suggestions seraient très appréciées, merci.

75
Rob Forrest

Utilisez le commentaire PHPDoc au niveau de la classe - en particulier @ méthode balise - fonctionne correctement dans PhpStorm:

/**
 * @method static someClass get_by_user_id(int $id) Bla-bla
 * @method static someClass get_first_by_id(int $id) 
 */
abstract class a {
...

Au dessus:

  • @method - balise PHPDoc
  • static - indique qu'il s'agit d'une méthode statique
  • someClass ou $this - type de retour
  • get_by_user_id - nom de la méthode
  • (int $id) - signature de la méthode: ([[type] [parameter]<, ...>])
  • Bla-bla - une description facultative

Plus à propos @method:

P.S. Pendant que @method static fonctionne bien dans PhpStorm (indique IDE que la méthode est statique), elle peut ne pas (encore?) être prise en charge par l'outil phpDocumentor réel (désolé, je ne l'ai pas utilisé depuis un certain temps).


Alternativement : (dans PhpStorm, bien sûr) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class - cela n'aidera en aucune façon la complétion de code pour ces méthodes, mais ne marquera pas ces méthodes magiques comme des erreurs de "méthode non définie".


ticket phpDocumentor concernant l'utilisation de RegEx/noms partiels pour @property/@method tags (comment cela peut être utile pour la documentation et le peu d'aide qu'il peut apporter à la réelle IDE lors de la complétion de code):

134
LazyOne

Assez lié à la question d'origine:

Vous pouvez également le définir dans le méta-fichier phpstorm. Voici un exemple de méthode d'usine (v2016.3):

// Define in .phpstorm.meta.php
namespace PHPSTORM_META {
    $STATIC_METHOD_TYPES = [
        \Factory::create('') => [],
    ];
}

// Then use in code
$factory = new \Factory();
$user = $factory->create(\User::class);
// Here you get autocomplete.
$user->subscribe();

De cette façon, vous n'avez pas à bloquer toutes les possibilités lorsque la magie se produit.

Ayez quelques docs pour plus de détails.

4
Yauheni Prakopchyk