如何来正确注释@return来让PHPstorm动态返回类

不言
Lepaskan: 2023-04-03 14:08:02
asal
3902 orang telah melayarinya

这篇文章给大家介绍的内容是关于正确注释@return让PHPstorm动态返回类,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

场景是这样的,有一个BaseModel(继承自ActionRecord),所有的其他model都继承自它,然后其中有一个方法,简单贴下这个类的代码:

class BaseModel extends ActiveRecord
{
    protected $temp_model;
    
    public function getCacheModel()
    {
        return $this->temp_model;
    }
}
Salin selepas log masuk

这个方法的作用是取得在做参数验证时,从数据库查出的,缓存下来的实例对象。
这个时候,问题来了,我在取出这个对象的时候,PHPstorm没有了提示(如方法提示,属性提示等),按照一般的情况,只需要在方法前面加上@return注释就可以了。

/**
 * @return static
 */
public function getCacheModel()
{
    return $this->temp_model;
}
Salin selepas log masuk

我们继续深入研究一下,关于这个static的意思,我特地在PHPDoc上查阅了一下,

static
An object of the class where this value was consumed, if inherited it will represent the child class. (see late static binding in the PHP manual).

Google翻译一下,大意如下:
消耗此值的类的对象,如果继承它将表示子类。
(参见PHP手册中的后期静态绑定)。

大概意思就是就会返回调用这个方法的类,如果是父类方法子类调用,那么将返回子类。

类似的还有2个

self
An object of the class where this type was used, if inherited it will still represent the class where it was originally defined.
$this
This exact object instance, usually used to denote a fluent interface.

直译如下,
self:使用此类型的类的对象,如果继承它,它仍将表示最初定义它的类。
大意就是和static差不多,但是父类方法子类调用,仍然返回父类。
$this:这个确切的对象实例,通常用于表示流畅的界面。
和self差不多。

但是到了这里,我的问题仍然没有解决,无论我@return的值改成什么,仍然返回的是BaseModel,尽管我在这个getCacheModel()方法里打印 self::className() 时,出现的是子类名。

于是我们继续往上面看,我是在controller调用的,controller的代码如下:

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

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

看起来没有什么问题,这个时候我们要注意了,  $model 是由$this->goCheck()调用得到的,我们去看一下goCheck方法:

//验证参数是否合法
public function goCheck($model, $dada = '')
{
    $data = $this->postData;//post传入的数据
    if ($model->load($data, '') && $model->validate())//数据效验
Salin selepas log masuk

return $model;

    else (new PublicFunction())->returnWayTip('1001', PublicFunction::getModelError($model));//这里理解成抛异常
}
Salin selepas log masuk

这里不规范的地方出现了,由于这里传入的是model(对象类型),所以PHPstorm并没法知道我们具体传入的是什么类,加上注释后:

/**
 * @param object $model
 * @param string $dada
 * @return model1|model2
 */
Salin selepas log masuk

这样后,问题“勉强解决”。只是每增加一个表,会需要在@return里增加表相对应的类名,而且会有类本来不应该存在的属性被提示。

为什么这里不能用static呢?  因为这里是$this调用的,返回controller类,并没有什么用,而这个也导致了后面使用$model->getCacheModel()方法时,没有办法正常识别应该返回的类(返回什么类取决与goCheck的@return注释是什么)。

当然你可以不写注释,那么你会发现,所以的提示都没有了。
这次我才真正意识到了注释的重要性。。。原来PHPstorm之所以都提示,都是因为大家按PHPDoc的规范写了注释啊!

最后可能有同学会问了,为什么不把goChekc方法放到BaseModel里呢?对的,实际上规范的做法是应该这样的,但是因为我这样把Yii::$app->request->post()赋值在controller里的$this->postData里(虽然这样方便一丢丢),而且在做token换id的一些操作了进行了手动赋值,所以没有办法,因为在model获取不到这个postData,当然你一定要挪进去也是可以的,只不过每次都需要传参$this->postData,见仁见智吧。

但是,这2个方法都并不规范,$this->postData = Yii::$app->request->post(); 把全局的变量变成了一个局部变量,规范的做法应该是使用Yii::$app->request->post($name,$dafaultValue)来给post数据赋值。

最后,因为并不是我一个人在写,所以没有办法进行大刀阔斧地改动,只能尽可能地优化。

相关文章推荐:

php递归函数return会出现无法正确返回想要值的情况

PHP中返回引用类型的方法,php返回引用类型

Atas ialah kandungan terperinci 如何来正确注释@return来让PHPstorm动态返回类. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan