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.
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
:
- https://docs.phpdoc.org/latest/references/phpdoc/tags/method.html
- https://github.com/phpDocumentor/phpDocumentor2/blob/develop/docs/PSR.md#711-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):
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.
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