ホームページ  >  記事  >  バックエンド開発  >  @return アノテーションを正しく付けて PHPstorm が動的にクラスを返せるようにする方法

@return アノテーションを正しく付けて PHPstorm が動的にクラスを返せるようにする方法

不言
不言オリジナル
2018-08-01 11:33:583834ブラウズ

この記事では、PHPstorm がクラスを動的に返すための正しいアノテーション @return を紹介します。これには特定の参照値があります。必要な友人はそれを参照できます。お役に立てば幸いです。

シナリオは次のようになります。BaseModel (ActionRecord から継承) があり、他のすべてのモデルはそれを継承し、その中にメソッドがあります。このクラスのコードを貼り付けるだけです:

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
この値が消費されたクラスのオブジェクト、もし 継承された場合は、子クラスを表します (「遅延静的バインディング」を参照)

Google で翻訳すると、一般的な考え方は次のとおりです。
この値を使用するクラスのオブジェクト。継承される場合はサブクラスを表します。
(PHP マニュアルの「遅延静的バインディング」を参照)。

一般的な意味は、このメソッドを呼び出したクラスが返されることです。メソッドが親クラスのサブクラスによって呼び出された場合は、サブクラスが返されます。

類似したものが 2 つあります

self
この型が使用されたクラスのオブジェクト。継承された場合でも、最初に定義されたクラスを表します。
$ this
このオブジェクト インスタンスは、通常、流暢なインターフェイスを表すために使用され、そのクラスです。

一般的な考え方は、これは static に似ていますが、親クラスのメソッドがサブクラスによって呼び出された場合でも、親クラスを返します。

$this: この正確なオブジェクト インスタンスは通常、滑らかなインターフェイスを表すために使用されます。
は自分自身に似ています。

しかし、この時点では、私の問題はまだ解決されていません。@return の値を何に変更しても、この getCacheModel() で self::className() を出力しても、依然として BaseModel が返されます。メソッド。表示されるのはサブクラス名です。

それでは、上を見ていきます。コントローラーで呼び出しました。コントローラーのコードは次のとおりです:

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));//这里理解成抛异常
}
ここに不規則性が現れます。ここではモデル (オブジェクト型) が渡されるため、PHPstorm はどのクラスを渡しているかを知る方法がありません。コメントを追加した後:

/**
 * @param object $model
 * @param string $dada
 * @return model1|model2
 */
、問題は「かろうじて解決」されます。 。ただ、テーブルが追加されるたびに、そのテーブルに対応するクラス名を @return に追加する必要があり、存在しないはずのクラスの属性が要求されます。

なぜここで static を使用できないのでしょうか? $this がここで呼び出されるため、コントローラー クラスを返すことは役に立ちません。また、後で $model->getCacheModel() メソッドが使用されるときに、必要なクラスを適切に識別する方法がないという事実にもつながります。 (どのクラスが返されるかは、 @return アノテーションが何であるか goCheck によって決まります)。

もちろん、コメントを書く必要はありません。コメントを書くと、すべてのプロンプトが消えていることがわかります。

今回はコメントの大切さを痛感しました。 。 。 PHPstorm がプロンプトを表示する理由は、全員が PHPDoc 仕様に従ってコメントを書いたためであることがわかりました。

最後に、学生の中には、なぜ goChekc メソッドを BaseModel に入れないのかと尋ねる人もいるかもしれません。はい、実際には標準的なアプローチは次のようになるはずですが、コントローラーの $this->postData に Yii::$app->request->post() を割り当てたため (これは便利ですが) Diudiu)、トークンをIDに変更する一部の操作は手動で割り当てられているため、モデル内でpostDataが取得できないため方法がありません。もちろん移動する必要がありますが、毎回パラメータを渡す必要があります。 postData、それは意見の問題です。

ただし、これら 2 つのメソッドは標準化されていません。$this->postData = Yii::$app->request->post(); は、グローバル変数をローカル変数に変換します。アプローチは、Yii::$app->request->post($name,$dafaultValue) を使用してポストデータに値を割り当てることです。

最後に、私は一人で書いているわけではないので、大幅な変更を加える方法はなく、可能な限り最適化することしかできません。

おすすめ関連記事:

php 再帰関数の return が目的の値を正しく返せない場合がある


PHP メソッドでは、参照型を返す、php は参照型を返す

以上が@return アノテーションを正しく付けて PHPstorm が動的にクラスを返せるようにする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。