Po wielu szczęśliwych latach kodowania w notatniku ++ i wysublimowanym, doradzono mi, abym spróbował PHP IDE. Wypróbowuję phpStorm i wydaje mi się to fajne. Uzupełnianie kodu i dokumentacja to świetna funkcja, ale nie działa, gdy używane są magiczne metody. Czy jest jakaś praca, aby phpStorm zrozumiał, co się dzieje 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 pobrać kolekcję obiektów za pomocą 1 lub więcej argumentów, które składają się na wywołanie funkcji.
Widzę, że w takich przypadkach istnieje instrukcja @method, ale phpStorm przechwytuje tylko pierwsze z tych instrukcji. Ponadto mogę ustawić zwracany typ tylko na mieszany, ponieważ wolałbym móc ustawić go jako dowolną klasę, do której została wywołana (b w moim przykładzie).
Wszelkie pomysły lub sugestie będą bardzo wdzięczne, dzięki.
źródło
_call
TO DOBRY POMYSŁ? !!__call
to zły pomysł. Chodzi o wdrożenie. Implementacja pokazana w powyższym pytaniu zdecydowanie nie byłaby najlepszym sposobem, ale w przypadku łańcuchowych interfejsów API zapewnia dużą elastyczność.Odpowiedzi:
Użyj komentarza PHPDoc na poziomie klasy - w szczególności tagu @method - 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
- tag PHPDocstatic
- mówi, że jest to metoda statycznasomeClass
lub$this
- typ zwrotuget_by_user_id
- nazwa metody(int $id)
- podpis metody:([[type] [parameter]<, ...>])
Bla-bla
- opcjonalny opisWięcej o
@method
:PS 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
- w żaden sposób nie pomoże to w uzupełnianiu kodu dla takich metod, ale nie będzie oznaczać tych magicznych metod jako błędów "niezdefiniowanej metody".bilet phpDocumentor dotyczący używania RegEx / częściowych nazw dla
@property
/@method
tagów (jak może to być przydatne dla dokumentacji i jak niewielką pomoc może wnieść do rzeczywistego IDE podczas zajmowania się uzupełnianiem kodu):źródło
@methods
w 140 różnych klasach. Czy nie ma bardziej ogólnego sposobu dostarczania dokumentacji?get_by_*(int $id)
.). Dla IDE (kontrola kodu, a nie zakończenie!) Masz rozwiązanie alt (wyłącz ostrzeżenia). Dla phpDocumentor (lub narzędzia alternatywnego) - nie jest mi znane rozwiązanie (może jest, ale ja o tym nie wiem). Masz link do github - załóż nowe zgłoszenie i poproś o dodanie takich „nazw częściowych” pasujących funkcjonalności - zobacz co powiedzą (najprawdopodobniej zostanie odrzucone). Jeśli zostanie zaimplementowany, IDE może go mieć również później.Nieco związane z oryginalnym pytaniem:
Możesz również zdefiniować to w pliku meta phpstorm. Oto przykład metody fabrycznej (wersja 2016.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ć wszystkich możliwości, gdy dzieje się magia.
Poproś o dokumenty, aby uzyskać szczegółowe informacje.
źródło