资讯专栏INFORMATION COLUMN

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

simon_chen / 1674人阅读

摘要:大意就是和差不多,但是父类方法子类调用,仍然返回父类。这个确切的对象实例,通常用于表示流畅的界面。这次我才真正意识到了注释的重要性。。。最后,因为并不是我一个人在写,所以没有办法进行大刀阔斧地改动,只能尽可能地优化。

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

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

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

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

我们继续深入研究一下,关于这个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();
}

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

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

return $model;

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

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

/**
 * @param object $model
 * @param string $dada
 * @return model1|model2
 */

这样后,问题“勉强解决”。只是每增加一个表,会需要在@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数据赋值。

最后,因为并不是我一个人在写,所以没有办法进行大刀阔斧地改动,只能尽可能地优化。BTW,希望大佬们有更好的意见可以说说,因为个人比较经验也比较不足,都是自己摸索。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29124.html

相关文章

  • Mac OS xDebug PhpStorm 快速配置

    摘要:确定环境的干净。这一步要优化的话应该是做一个类似缓存的机制,对于这种配置加载的性能提升所以我们在调试必然是要在这里配置环境的接口。 前言 在网上找了一些相关配置的例子,觉得很多比较复杂,并且配置项过于多了,有很多冗余并不是最开始就需要的配置,所以写一下记录,也方便以后自己查阅。 一、brew 安装 php 在 Mac OS 这边不需要手动去下载编译打包,直接使用 brew 进行快捷安装...

    forrest23 评论0 收藏0
  • 如何把phpStorm打造成自己的专属IDE?

    摘要:本身是一款收费的软件,有经济基础的还是建议购买注册号,支持正版。选择自己喜欢的风格,即可。如何安装自己下载的主题在官方主题下载自己喜欢的主题,下载下来的是格式的,然后将文件拷贝到的配置目录里。 php开发神器之一,必然会说到phpStorm,工具的强大之处是有目共睹的,开发工具即使再强大,功能再齐全,也是一种工具,重要的是你怎么看待它和使用它。之前一直用的zend studio,最近试...

    Forelax 评论0 收藏0
  • 每一位JSer都应当掌握的注释标记

    摘要:表示该函数接受可变数量的参数,并指定一个类型的参数一个可选参数可选参数,默认值指示参数是可选的。一个注释块中您可以包含多个标签。 简介 注释标签在代码注释中的作用非常大,但是可能很多同学在平常开发中会忽略这些标签的作用,所以我这边特地整理一些常用的注释标记,通过图文展现形式,希望能帮助你能更好理解每个注释标签的作用. 想必掌握这些注释标签之后,不光对您今后的自己代码编写,还是阅读优秀源...

    Salamander 评论0 收藏0
  • PHP编码规范

    摘要:为什么需要编码规范为了提高工作效率,保证开发的有效性和合理性。在文件编码中,选择推荐在换行符中,选择推荐文件命名程序的文件名和目录名都采用有意义的英文命名。最后最后说的是,本规范不是强制,也不是标准。回复编码规范即可。 为什么需要编码规范? 为了提高工作效率,保证开发的有效性和合理性。 为了提高代码可读性和可重复利用性,从而节约沟通成本。 本文主要参考了 PEAR 规范,并进行适当...

    xuweijian 评论0 收藏0
  • Laravel 超好用代码提示工具 Laravel IDE Helper

    摘要:是一个极其好用的代码提示及补全工具,可以给编写代码带来极大的便利。例如事件将返回一个对象,利用文件您可以调用并且它将自动完成的方法。提示您可能需要重启使文件生效。 showImg(https://segmentfault.com/img/remote/1460000014528926); Laravel IDE Helper 是一个极其好用的代码提示及补全工具,可以给编写代码带来极大的...

    wemallshop 评论0 收藏0

发表评论

0条评论

simon_chen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<