この記事では、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
このオブジェクト インスタンスは、通常、流暢なインターフェイスを表すために使用され、そのクラスです。
$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、それは意見の問題です。
php 再帰関数の return が目的の値を正しく返せない場合がある
以上が@return アノテーションを正しく付けて PHPstorm が動的にクラスを返せるようにする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。