2017-08-08 98 views
2

一般的返回類型,這是我如何得到我的IDE(PhpStorm 2017)認識到,我沒有得到正式聲明變量的類型:PHPDoc的和PhpStorm:表示魔術方法

/* 
* @var User $user 
*/ 
foreach($users as $user){} 

IDE隨後知道$user屬於User類。現在我面臨的情況與這一行:

Yii::app()->user->login() 

具體來說,IDE不知道什麼類型的user是。我得到警告:

現場通過魔術方法訪問

於是,我就用指定:

/** 
* @var User Yii::app()->user 
*/ 
Yii::app()->user->login(); 

但是,這並不有所作爲。我怎樣才能幫助IDE解決這個問題?

+2

*「於是,我就用指定:'/ ** @var用戶的Yii ::應用程序() - >用戶* /'「* - 它不會像那樣工作 - 這樣你可以僅鍵入一級變量 - 而不是某個其他類的屬性。最好的方法是與@德米特里的答案去,如果你只需要這種類型的提示一次(但它*可能*有一些副作用))。否則,請通過中間變量在本地執行,就像@Nima所建議的那樣(但您必須在每個您將要使用它的地方執行此操作)。 – LazyOne

+0

另一種可能的解決方案 - 將'Yii :: app() - > user'作爲參數傳遞給您的類構造函數/方法調用等 - 這樣您可以輕鬆地鍵入內部類變量。 – LazyOne

+0

@LazyOne:「*最好的方法是與德米特里的答案一起去,如果你只需要這種類型的提示一次*」Dmitry的答案似乎無處不在'Yii :: app() - > user'出現,不只在一個地方。我只用他的第二課('CApplication')來嘗試它;不知道副作用是什麼 – BeetleJuice

回答

5

創建項目phpdoc.php文件和明年的說:

<?php 

/** 
* Class Yii 
* @method static CApplication app() 
*/ 
class Yii extends YiiBase 
{ 
} 

/** 
* Class CApplication 
* 
* @property User $user 
*/ 
class CApplication extends CModule 
{ 
} 
+0

+1!幾個問題:1)如果我刪除第一堂課'Yii',它仍然有效。這是需要的嗎? ('Yii'已經在供應商庫中聲明,就像'CApplication'一樣)。 2)文件名* phpdoc.php *有什麼特別的意義? – BeetleJuice

+0

我你刪除了第一堂課,它仍然有效,那麼它沒關係。 phpdoc.php名稱並不特別,它只是顯示用於提示的文件。 – Dmitry

3

您需要將Yii::app()->user(或任何其他魔術屬性)賦值給一個新變量並告訴IDE該變量。像:

/** 
* @var User $user 
*/ 
$user = Yii::app()->user; 
$user->login(); 
+0

嘿尼瑪。給予好評。謝謝,這是我能想到的唯一解決方案。我只是想知道是否有更優雅的一個。 – BeetleJuice