如何用抽象工厂方法告诉 PhpStorm 变量类型?
How to tell PhpStorm type of variable with abstract factory method?
我有一个像这样的摘要class
abstract class AbstractClass
{
/**
* @return AbstractClass
*/
public static function forge($data)
{
return new static($data);
}
}
和另一个继承它的 class
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);
}
}
这样它将被解析为调用class。
P.S.
同样 @return $this
可用于非静态方法。
P.P.S.
请注意,在一些不太简单的情况下(例如,在另一个 class 的另一种方法中使用具有这种 @return
(静态或 $this)的方法 class 也使用这种方法)可能会导致 IDE 混淆,从而产生错误警告——这是一个 IDE 问题,希望在未来的某个版本中得到解决。
我有一个像这样的摘要class
abstract class AbstractClass
{
/**
* @return AbstractClass
*/
public static function forge($data)
{
return new static($data);
}
}
和另一个继承它的 class
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);
}
}
这样它将被解析为调用class。
P.S.
同样 @return $this
可用于非静态方法。
P.P.S.
请注意,在一些不太简单的情况下(例如,在另一个 class 的另一种方法中使用具有这种 @return
(静态或 $this)的方法 class 也使用这种方法)可能会导致 IDE 混淆,从而产生错误警告——这是一个 IDE 问题,希望在未来的某个版本中得到解决。