如何用抽象工厂方法来判断变量的PhpStorm类型?
我有一个这样的抽象类如何用抽象工厂方法来判断变量的PhpStorm类型?,php,phpstorm,jetbrains-ide,Php,Phpstorm,Jetbrains Ide,我有一个这样的抽象类 abstract class AbstractClass { /** * @return AbstractClass */ public static function forge($data) { return new static($data); } } 和另一个继承它的类 class OtherClass extends AbstractClass { public function m
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);
}
}
这样,它将被解析为调用类
p.S.
类似地,@return$此
可用于非静态方法
p.p.S.
请注意,在一些不太简单的情况下(例如,在另一个类的另一个方法中使用具有此类
@return
(static或$this)的某个类的某个方法,而另一个类的另一个方法也使用此类方法),可能会导致IDE混淆,从而产生错误警告——这是一个IDE问题,有望在未来的某个版本中得到解决。。。但是您的forge
方法无论如何都不会返回任何内容。。。另外,在静态方法中使用$this
…您是对的,作为一个简单的例子,我对它进行了编辑,以使我的问题更加清晰不知道您从哪里得到了错误?我运行了您的示例,它给出的警告与类抽象无关。它不会自动完成OtherClass::my_方法
,因为my_方法不是静态的,不应该静态引用。如果实例化一个OtherClass,例如$OtherClass=new OtherClass()代码>和键入$otherClass->
它将为forge
和mou方法提供自动完成建议。你能提供一个实际导致这个错误的例子吗?啊,在我的例子中,ide似乎是混乱的。