Сценарий заключается в том, что существует Базовая модель (унаследованная от Activerecord), и все остальные модели наследуются от нее. Тогда есть способ просто вставить код этого класса.
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; }
Давайте продолжим изучать значение этой статики. Я посмотрел это на PHPDoc.
статический объект класса, в котором было использовано это значение, если он унаследован, будет представлять дочерний класс. (см. Позднюю статическую привязку в руководстве по PHP).
Google переводит это следующим образом: объект класса, который использует это значение, будет представлять подкласс, если он унаследован. (См. Последнюю статическую привязку в руководстве по PHP).
Это означает, что класс, вызывающий этот метод, будет возвращен, и если он вызывается подклассом родительского метода, он будет возвращен в подкласс.
Два других похожи.
самостоятельный объект класса, в котором использовался этот тип, если он унаследован, он все равно будет представлять класс, в котором он был первоначально определен. $это точный экземпляр объекта, обычно используемый для обозначения свободного интерфейса.
Дословный перевод выглядит следующим образом. Self: Объект, использующий этот тип класса, если он унаследован, все равно будет представлять класс, который его первоначально определил. Основная идея заключается в том, что он похож на статический, но вызов подкласса родительского метода все равно возвращается в родительский класс. Это: Этот точный экземпляр объекта обычно используется для представления плавного интерфейса. Это похоже на самость.
Но на данный момент моя проблема все еще не решена. Каким бы ни было значение моего @return, оно все равно возвращает базовую модель, хотя, когда я печатаю self:: имя класса () в этом методе getCacheModel (), появляется имя подкласса.
Итак, давайте продолжим и посмотрим, что я вызвал контроллер, и код контроллера выглядит следующим образом:
public function actionCommitReward() { $model=$this->goCheck(new TakeRewards(['scenario'=>'commit_reward'])); // Get the actual data to be modified $reward = $model->getCacheModel(); }
Похоже, это не проблема. В это время мы должны обратить на это внимание. Модель $называется $this – > goCheck () Давайте взглянем на метод goCheck:
// Verify the validity of parameters public function goCheck($model, $dada = '') { $data = $this - > postData; //post incoming data If ($model - > Load ($data,'') & & $model - > validate ()// data validity
возврат модели $;
Other (new PublicFunction ()- > returnWayTip ('1001', PublicFunction:: getModelError ($model); // This is understood as throwing an exception. }
Там, где есть аномалия, PhpStorm не знает точно, в каком классе мы проходим, так как модель (тип объекта) передается здесь и с аннотациями:
/** * @param object $model * @param string $dada * @return model1|model2 */
После этого проблема была “неохотно решена”. Просто для каждой дополнительной таблицы вам нужно добавить соответствующее имя класса таблицы в @return, и будут запрошены атрибуты класса, которые не должны существовать.
Почему здесь нельзя использовать статику? Поскольку это вызывается $this, бесполезно возвращать класс контроллера, что также приводит к невозможности распознать класс, который должен быть возвращен при использовании метода $model – > getCacheModel () позже (какой класс возвращать, зависит от аннотации @return Гочека).
Конечно, если вы не прокомментируете это, вы обнаружите, что в этом нет никаких намеков. На этот раз я действительно осознал важность аннотаций… Причина, по которой был запрошен PhpStorm, заключается в том, что все написали комментарии в соответствии со спецификациями PHP Doc.
Наконец, некоторые студенты могут спросить, почему бы не включить метод go Check в базовую модель? Да, на самом деле нормативный подход должен быть таким, но поскольку я назначаю Yii: $app – > request – > post () $this – > postData в контроллере (хотя его легко потерять), а ручное назначение выполняется в некоторых операциях идентификатора обмена токенами, поэтому нет никакого способа, потому что postData не могут быть получены в модели, конечно, вы должны переехать. Итак, вам просто нужно каждый раз передавать $this – > postData. У вас разные мнения.
Однако эти два метода не стандартизированы, $this – >:: $app – > запрос – > post (); чтобы превратить глобальную переменную в локальную переменную, стандартизированный подход должен заключаться в использовании Yii:: $app – > запрос – > post ($name, $dafaultValue) для присвоения значений postData.
Наконец, поскольку я пишу не один, нет никакого способа внести радикальные изменения, только максимально оптимизировать. Кстати, я надеюсь, что у старейшин есть лучшее мнение, чтобы сказать, потому что личный сравнительный опыт также относительно недостаточен, это их собственные исследования.