Maison  >  Article  >  développement back-end  >  Comment annoter correctement @return pour permettre à PHPstorm de renvoyer dynamiquement les classes

Comment annoter correctement @return pour permettre à PHPstorm de renvoyer dynamiquement les classes

不言
不言original
2018-08-01 11:33:583904parcourir

Cet article vous présente l'annotation correcte @return pour permettre à PHPstorm de renvoyer dynamiquement la classe. Elle a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère que cela vous sera utile.

La scène est comme ceci. Il y a un BaseModel (hérité d'ActionRecord), tous les autres modèles en héritent, et puis il y a une méthode dedans. Collez simplement le code de cette classe : <.>

class BaseModel extends ActiveRecord
{
    protected $temp_model;
    
    public function getCacheModel()
    {
        return $this->temp_model;
    }
}
La fonction de cette méthode est d'obtenir l'objet d'instance mis en cache récupéré de la base de données lors de la vérification des paramètres.

À ce moment-là, le problème est survenu. Lorsque j'ai retiré cet objet, PHPstorm n'avait aucune invite (telle que des invites de méthode, des invites d'attribut, etc.). Selon la situation générale, il me suffit d'ajouter l'annotation @return. devant la méthode.

/**
 * @return static
 */
public function getCacheModel()
{
    return $this->temp_model;
}
Continuons à étudier en profondeur. Concernant la signification de static, je l'ai spécifiquement vérifié sur PHPDoc

static

Un objet de la classe où cette valeur a été consommée , si hérité, il représentera la classe enfant (voir liaison statique tardive dans. le manuel PHP).

Google le traduit, l'idée générale est la suivante :

L'objet de la classe qui consomme cette valeur, s'il est hérité il représentera une sous-classe.
(voir Liaison statique tardive dans le manuel PHP).

Cela signifie probablement que la classe qui a appelé cette méthode sera renvoyée. Si la méthode est appelée par une sous-classe de la classe parent, la sous-classe sera renvoyée.

Il y en a 2 similaires

self

Un objet de la classe où ce type a été utilisé, s'il est hérité, il représentera toujours la classe où il a été défini à l'origine.
$ this
Cette instance d'objet exacte, généralement utilisée pour désigner une interface fluide dans sa classe.
L'idée générale est que c'est similaire à static, mais lorsque la méthode de la classe parent est appelée par la sous-classe, elle renvoie toujours la classe parent.

$this : Cette instance d'objet exacte est généralement utilisée pour représenter une interface fluide.

Semblable à soi.

Mais à ce stade, mon problème n'est toujours pas résolu. Peu importe ce que je modifie la valeur de @return, BaseModel est toujours renvoyé, même si j'imprime self::className() dans ce getCacheModel(). méthode. ce qui apparaît est le nom de la sous-classe.

Nous continuons donc à regarder ci-dessus. Je l'ai appelé dans le contrôleur. Le code du contrôleur est le suivant :

Il semble qu'il n'y ait pas de problème pour le moment. ,

$model est obtenu en appelant $this->goCheck()

Jetons un coup d'œil à la méthode goCheck :
public function actionCommitReward()
{
    $model=$this->goCheck(new TakeRewards(['scenario'=>'commit_reward']));

    //获取实际要修改的数据
    $reward = $model->getCacheModel();
}

return $model;

.
//验证参数是否合法
public function goCheck($model, $dada = '')
{
    $data = $this->postData;//post传入的数据
    if ($model->load($data, '') && $model->validate())//数据效验
Pas ici Le standard apparaît. Puisque le modèle (type d'objet) est transmis ici, PHPstorm ne peut pas savoir dans quelle classe nous transmettons. Après avoir ajouté l'annotation :

    else (new PublicFunction())->returnWayTip('1001', PublicFunction::getModelError($model));//这里理解成抛异常
}
Après cela, le problème. était « à peine résolu ». C'est juste qu'à chaque fois qu'une table est ajoutée, le nom de classe correspondant à la table devra être ajouté à @return, et les attributs de la classe qui ne devraient pas exister seront demandés.

Pourquoi le statique ne peut-il pas être utilisé ici ? Étant donné que $this est appelé ici, renvoyer la classe du contrôleur n'est d'aucune utilité. Cela conduit également au fait que lorsque la méthode $model->getCacheModel() est utilisée ultérieurement, il n'y a aucun moyen d'identifier correctement la classe qui devrait l'être. renvoyé (la classe renvoyée dépend de goCheck de l'annotation @return).
/**
 * @param object $model
 * @param string $dada
 * @return model1|model2
 */

Bien sûr, vous n'êtes pas obligé d'écrire des commentaires, vous constaterez alors que toutes les invites ont disparu.

Cette fois, j'ai vraiment réalisé l'importance des commentaires. . . Il s'avère que la raison pour laquelle PHPstorm vous invite est parce que tout le monde a écrit des commentaires conformément aux spécifications PHPDoc !

Enfin, certains étudiants peuvent se demander, pourquoi ne pas mettre la méthode goChekc dans BaseModel ? Oui, en fait, l'approche standard devrait être comme ceci, mais parce que j'ai attribué Yii::$app->request->post() à $this->postData dans le contrôleur (bien que cela soit pratique) Diudiu), et certaines opérations telles que l'échange de jetons contre l'identifiant ont été attribuées manuellement, il n'y a donc aucun moyen car les postData ne peuvent pas être obtenues dans le modèle. Bien sûr, vous devez les déplacer, mais vous devez transmettre des paramètres à chaque fois. ;postData, c'est une question d'opinion.


Cependant, ces deux méthodes ne sont pas standardisées. $this->postData = Yii::$app->request->post(); devrait être d'utiliser Yii::$app->request->post($name,$dafaultValue) pour attribuer des valeurs aux données de publication.

Enfin, comme je ne l'écris pas seul, je ne peux pas apporter de changements drastiques et je ne peux que l'optimiser autant que possible.

Articles connexes recommandés :

Le retour de la fonction récursive php ne parviendra pas à renvoyer correctement la valeur souhaitée

Dans les méthodes PHP qui renvoie les types de référence, php renvoie les types de référence

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn