Как определить тип переменной PhpStorm с помощью абстрактного метода фабрики?

У меня есть абстрактный класс, как это

abstract class AbstractClass
{
/**
* @return AbstractClass
*/
public static function forge($data)
{
return new static($data);
}
}

и другой класс, который наследует его

class OtherClass extends AbstractClass
{
public function my_method()
{
echo 'hello';
}
}

Когда я звоню как

$otherClass = OtherClass::forge($otherclass_data);

PhpStorm не будет автозаполняться my_method()и на самом деле выскакивает ошибка:

Method 'my_method' not found in class 'AbstractClass'

Есть ли способ заставить PhpStorm узнать, что я подделал OtherClassне AbstractClass?

-1

Решение

использование @return static в таких случаях, например

abstract class AbstractClass
{
/**
* @return static
*/
public static function forge($data)
{
return new static($data);
}
}

Таким образом, он будет разрешен вызывающему классу.

Постскриптум
так же @return $this можно использовать для нестатических методов.

P.P.S.
Обратите внимание, что в некоторых не очень простых случаях (например, с использованием некоторого метода одного класса, который имеет такой @return (статический или $ this) в другом методе другого класса, который также использует такой подход) может привести к путанице в среде IDE, которая приведет к ложным предупреждениям — это проблема IDE, и, надеюсь, будет решена в одном из будущих выпусков.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]