Рубрики
Uncategorized

Правильная аннотация @return позволяет PhpStorm динамически возвращать классы

Автор оригинала: David Wong.

Сценарий заключается в том, что существует Базовая модель (унаследованная от 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.

Наконец, поскольку я пишу не один, нет никакого способа внести радикальные изменения, только максимально оптимизировать. Кстати, я надеюсь, что у старейшин есть лучшее мнение, чтобы сказать, потому что личный сравнительный опыт также относительно недостаточен, это их собственные исследования.