So kommentieren Sie @return richtig, damit PHPstorm Klassen dynamisch zurückgibt

不言
Freigeben: 2023-04-03 14:08:02
Original
3869 Leute haben es durchsucht

Dieser Artikel führt Sie in die korrekte Annotation von @return ein, damit PHPstorm die Klasse dynamisch zurückgibt. Ich hoffe, dass er für Sie hilfreich ist.

Die Szene sieht so aus: Es gibt ein BaseModel (geerbt von ActionRecord), alle anderen Modelle erben davon, und dann gibt es einfach eine Methode darin:

class BaseModel extends ActiveRecord
{
    protected $temp_model;
    
    public function getCacheModel()
    {
        return $this->temp_model;
    }
}
Nach dem Login kopieren

Die Funktion dieser Methode besteht darin, das zwischengespeicherte Instanzobjekt aus der Datenbank abzurufen, das während der Parameterüberprüfung gefunden wurde.
Zu diesem Zeitpunkt trat das Problem auf, als ich dieses Objekt herausnahm. PHPstorm hatte keine Eingabeaufforderungen (wie Methodeneingabeaufforderungen, Attributeingabeaufforderungen usw.) und musste nur die @return-Annotation hinzufügen vor der Methode.

/**
 * @return static
 */
public function getCacheModel()
{
    return $this->temp_model;
}
Nach dem Login kopieren

Was die Bedeutung von static betrifft, habe ich es speziell auf PHPDoc überprüft.

static
Ein Objekt der Klasse, in der dieser Wert verbraucht wurde geerbt wird es die untergeordnete Klasse darstellen (siehe späte statische Bindung in Das PHP-Handbuch).

Google übersetzt es, die allgemeine Idee ist wie folgt:
Das Objekt der Klasse, das diesen Wert verbraucht, stellt bei Vererbung eine Unterklasse dar.
(siehe Späte statische Bindung im PHP-Handbuch).

Bedeutet wahrscheinlich, dass die Klasse zurückgegeben wird, die diese Methode aufgerufen hat. Wenn die Methode von einer Unterklasse der übergeordneten Klasse aufgerufen wird, wird die Unterklasse zurückgegeben.

Es gibt 2 ähnliche

self
Ein Objekt der Klasse, in der dieser Typ verwendet wurde. Bei Vererbung stellt es immer noch die Klasse dar, in der es ursprünglich definiert wurde.
$ this
Diese genaue Objektinstanz wird normalerweise zur Bezeichnung einer fließenden Schnittstelle verwendet.

Die allgemeine Idee ist, dass es der statischen Methode ähnelt, aber wenn die übergeordnete Klassenmethode von der Unterklasse aufgerufen wird, gibt sie dennoch die übergeordnete Klasse zurück.

$this: Diese genaue Objektinstanz wird normalerweise zur Darstellung einer fließenden Schnittstelle verwendet.
Ähnlich wie ich selbst.

Aber zu diesem Zeitpunkt ist mein Problem immer noch nicht gelöst, egal in was ich den Wert von @return ändere, BaseModel wird immer noch zurückgegeben, auch wenn ich self::className() in diesem getCacheModel() ausdrucke. Methode, was angezeigt wird, ist der Name der Unterklasse.

Also schauen wir weiter oben nach. Der Controller-Code lautet wie folgt:

public function actionCommitReward()
{
    $model=$this->goCheck(new TakeRewards(['scenario'=>'commit_reward']));

    //获取实际要修改的数据
    $reward = $model->getCacheModel();
}
Nach dem Login kopieren
Es scheint, dass es derzeit kein Problem gibt,

$model Es wird durch Aufruf von $this->goCheck()

erhalten. Schauen wir uns die goCheck-Methode an:

//验证参数是否合法
public function goCheck($model, $dada = '')
{
    $data = $this->postData;//post传入的数据
    if ($model->load($data, '') && $model->validate())//数据效验
Nach dem Login kopieren
return $model;
    else (new PublicFunction())->returnWayTip('1001', PublicFunction::getModelError($model));//这里理解成抛异常
}
Nach dem Login kopieren
Es treten Unregelmäßigkeiten auf Da das Modell (Objekttyp) hier übergeben wird, kann PHPstorm nicht wissen, welche Klasse wir übergeben. Nach dem Hinzufügen des Kommentars:

/**
 * @param object $model
 * @param string $dada
 * @return model1|model2
 */
Nach dem Login kopieren
ist das Problem „kaum gelöst“. Es ist nur so, dass jedes Mal, wenn eine Tabelle hinzugefügt wird, der Klassenname, der der Tabelle entspricht, zu @return hinzugefügt werden muss und Attribute der Klasse, die nicht vorhanden sein sollten, abgefragt werden.

Warum kann hier keine statische Aufladung verwendet werden? Da $this hier aufgerufen wird, ist die Rückgabe der Controller-Klasse nutzlos. Dies führt auch dazu, dass es bei späterer Verwendung der Methode $model->getCacheModel() keine Möglichkeit gibt, die Klasse richtig zu identifizieren zurückgegeben (welche Klasse zurückgegeben wird, hängt von goCheck ab, was die @return-Annotation ist).

Natürlich müssen Sie keine Kommentare schreiben, dann werden Sie feststellen, dass alle Eingabeaufforderungen weg sind.

Dieses Mal wurde mir wirklich klar, wie wichtig Kommentare sind. . . Es stellt sich heraus, dass der Grund für die Eingabeaufforderungen von PHPstorm darin liegt, dass jeder Kommentare gemäß den PHPDoc-Spezifikationen geschrieben hat!

Abschließend fragen sich einige Studenten vielleicht: Warum nicht die goChekc-Methode in BaseModel integrieren? Ja, tatsächlich sollte der Standardansatz so aussehen, aber weil ich Yii::$app->request->post() $this->postData im Controller zugewiesen habe (obwohl dies praktisch ist), Diudiu), und einige Operationen zum Ändern von Tokens in IDs wurden manuell zugewiesen, daher gibt es keine Möglichkeit, da die postData nicht im Modell abgerufen werden können. Natürlich müssen Sie sie verschieben, aber Sie müssen jedes Mal Parameter übergeben. postData, es ist Ansichtssache.

Diese beiden Methoden sind jedoch nicht standardisiert. $this->postData = Yii::$app->request->post(); wandelt die globale Variable in eine lokale Variable um Der Ansatz sollte darin bestehen, Yii::$app->request->post($name,$dafaultValue) zu verwenden, um Post-Daten Werte zuzuweisen.

Da ich es nicht alleine schreibe, kann ich schließlich keine drastischen Änderungen vornehmen und es nur so weit wie möglich optimieren.

Empfohlene verwandte Artikel:

Rekursive PHP-Funktionsrückgabe wird den gewünschten Wert nicht korrekt zurückgeben


In PHP-Methoden, die Referenztypen zurückgeben, PHP gibt Referenztypen zurück

Das obige ist der detaillierte Inhalt vonSo kommentieren Sie @return richtig, damit PHPstorm Klassen dynamisch zurückgibt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!