场景是这样的,有一个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数据赋值。
最后,因为并不是我一个人在写,所以没有办法进行大刀阔斧地改动,只能尽可能地优化。
相关文章推荐:
php递归函数return会出现无法正确返回想要值的情况
php中返回引用类型的方法,php返回引用类型
以上就是如何来正确注释@return来让phpstorm动态返回类的详细内容。
