У меня есть абстрактный класс, как это
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
?
использование @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, и, надеюсь, будет решена в одном из будущих выпусков.
Других решений пока нет …