Jak dokumentować metody magic (call i callStatic) dla IDE

Po wielu szczęśliwych latach kodowania w notepad++ i sublime, doradzono mi, aby dać PHP IDE spróbować. Wypróbowuję phpStorm i wydaje mi się, że fajny. Uzupełnianie kodu i dokumentacja to świetna funkcja, ale nie działa mi, gdy używane są magiczne metody. Czy istnieje obejście, aby PhpStorm zrozumiał, co dzieje się w magicznych metodach?

Nasza sytuacja wygląda mniej więcej tak:

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();

Magiczna metoda callStatic pozwala nam uzyskać zbiór obiektów za pomocą 1 lub więcej argumentów składających się na wywołanie funkcji.

Widzę, że w takich przypadkach istnieje instrukcja @method, ale phpStorm zbiera tylko pierwsze z tych instrukcji. Ponadto mogę ustawić tylko Typ powrotu na mixed where, ponieważ wolałbym być w stanie ustawić go jako dowolną klasę, która została wywołana (b w moim przykładzie).

Wszelkie pomysły lub sugestie zostaną bardzo wdzięcznie przyjęte, dzięki.

Author: Rob Forrest, 2013-03-26

2 answers

Użyj komentarza PHPDoc na poziomie klasy -- konkretnie @ method tag -- działa dobrze w PhpStorm:

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

W powyższym:

  • @method -- znacznik PHPDoc
  • static -- mówi, że jest to metoda statyczna
  • someClass lub $this -- return type
  • get_by_user_id -- nazwa metody
  • (int $id) -- podpis metody: ([[type] [parameter]<, ...>])
  • Bla-bla -- jakiś opcjonalny opis

Więcej o @method:

P. S. Chociaż @method static działa dobrze w PhpStorm (mówi IDE, że metoda jest statyczna), może nie być (jeszcze?) obsługiwane przez rzeczywiste narzędzie phpDocumentor (przepraszam, nie używałem go przez jakiś czas).


Alternatywnie: (oczywiście w PhpStorm) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class -- it w żaden sposób nie pomoże w uzupełnianiu kodu dla takich metod, ale nie oznaczy tych magicznych metod jako błędów "niezdefiniowanej metody".


Phpdocumentor ' s ticket odnośnie używania nazw RegEx/częściowych dla @property/@method tags (w jaki sposób może być użyteczny dla dokumentacji i jak niewiele może pomóc rzeczywistemu IDE podczas wypełniania kodu):

 146
Author: LazyOne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-10 00:03:36

Nieco związane z pierwotnym pytaniem:

Można to również zdefiniować w pliku meta phpstorm. Oto przykład dla metody fabrycznej (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();

W ten sposób nie musisz blokować każdej możliwości, gdy dzieje się magia.

Miej jakieś dokumenty dla szczegółów.

 4
Author: Yauheni Prakopchyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-27 10:28:35