Nach vielen glücklichen Jahren des Codierens in Notepad ++ und Sublime wurde mir geraten, eine PHP-IDE auszuprobieren. Ich probiere phpStorm aus und es scheint schön. Die Vervollständigung und Dokumentation des Codes ist eine großartige Funktion, funktioniert aber für mich nicht, wenn magische Methoden verwendet werden. Gibt es eine Lösung, um phpStorm dazu zu bringen, zu verstehen, was in magischen Methoden vor sich geht?
Unsere Situation ist ungefähr so:
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();
Mit der magischen callStatic-Methode können wir eine Sammlung von Objekten über ein oder mehrere Argumente abrufen, aus denen der Funktionsaufruf besteht.
Ich sehe, dass es in diesen Fällen eine @ method-Anweisung gibt, aber phpStorm greift nur die erste dieser Anweisungen auf. Außerdem kann ich den Rückgabetyp nur dann auf gemischt setzen, wenn ich es vorziehen würde, ihn als die Klasse festzulegen, für die dies aufgerufen wurde (b in meinem Beispiel).
Alle Ideen oder Vorschläge würden sehr dankbar aufgenommen, danke.
quelle
_call
ist eine gute Idee? !!__call
eine schlechte Idee ist. Alles dreht sich um die Implementierung. Die in der obigen Frage gezeigte Implementierung wäre definitiv nicht der beste Weg, aber für kettenfähige APIs bietet sie viel Flexibilität.Antworten:
Die Verwendung eines PHPDoc-Kommentars auf Klassenebene - insbesondere des @ method- Tags - funktioniert in PhpStorm einwandfrei :
/** * @method static someClass get_by_user_id(int $id) Bla-bla * @method static someClass get_first_by_id(int $id) */ abstract class a { ...
In obigem:
@method
- PHPDoc-Tagstatic
- sagt, dass dies eine statische Methode istsomeClass
oder$this
- Rückgabetypget_by_user_id
- Methodenname(int $id)
- Methodensignatur:([[type] [parameter]<, ...>])
Bla-bla
- eine optionale BeschreibungMehr zu
@method
:PS Obwohl es
@method static
in PhpStorm einwandfrei funktioniert (teilt IDE mit, dass die Methode statisch ist), wird es möglicherweise (noch?) Nicht vom tatsächlichen phpDocumentor-Tool unterstützt (leider wurde es eine Weile nicht verwendet).Alternativ : (natürlich in PhpStorm)
Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class
- es hilft in keiner Weise bei der Code-Vervollständigung für solche Methoden, markiert diese magischen Methoden jedoch nicht als "undefinierte Methoden" -Fehler.phpDocumentors Ticket zur Verwendung von RegEx / Teilnamen für
@property
/@method
Tags (wie es für die Dokumentation nützlich sein kann und wie wenig Hilfe es für die eigentliche IDE beim Umgang mit Code-Vervollständigung bringen kann):quelle
@methods
in 140 verschiedenen Klassen haben. Gibt es keine allgemeinere Möglichkeit, Dokumentation bereitzustellen?get_by_*(int $id)
. B. ). Für IDE (Code-Inspektion, nicht Abschluss!) Haben Sie eine alternative Lösung (Warnungen deaktivieren). Für phpDocumentor (oder ein alternatives Tool) - mir ist keine Lösung bekannt (vielleicht ist sie vorhanden, aber ich weiß nichts darüber). Sie haben den Link zu github - legen Sie ein neues Ticket ab und fragen Sie nach dem Hinzufügen solcher Übereinstimmungsfunktionen für "Teilnamen" - sehen Sie, was sie sagen (höchstwahrscheinlich werden sie abgelehnt). Wenn es implementiert wird, kann IDE es später auch haben.Etwas im Zusammenhang mit der ursprünglichen Frage:
Sie können dies auch in der phpstorm-Metadatei definieren. Hier ist ein Beispiel für die Factory-Methode (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();
Auf diese Weise müssen Sie nicht jede Möglichkeit dokumentieren, wenn Magie passiert.
Haben Sie einige Dokumente für Details.
quelle