我的代码或多或少是这样的:
class Foo {
public static function factory($str) {
$class = "Foo_" . $str;
return new $class;
}
}
class Foo_Bar {
public function razzle() {
print "Foo_Bar->baz() was called";
}
}
$Obj = Foo::factory('Bar');
我希望PhpStorm了解$Obj
是Foo_Bar
对象,因此,例如,如果我输入$Obj->raz
,razzle()
将显示自动完成。< / p>
有没有办法得到这个?告诉PhpStorm函数Foo::factory($str)
返回类型为Foo_$str
的对象?我的猜测是答案是否定的。
答案 0 :(得分:12)
据我所知,你不能让PHPStorm理解Foo给出的东西,因为它是动态的。但是你可以告诉PHPStorm你的$ Obj变量是什么,在它上面添加一个doc注释,如下所示:
/** @var Foo_Bar $Obj */
$Obj = Foo::factory('Bar');
答案 1 :(得分:8)
是的,如果您的工厂是静态方法,可以执行此操作。它应该适用于您提供的示例。
更多详情,可在此处找到一些基本示例:http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata
答案 2 :(得分:3)
你应该使用phpstorm元数据,它适用于动态和静态调用。
#!
在项目根目录中创建一个文件,并将其命名为notReallyHomePage
:
class Foo {
public function factory($str) {
$class = "Foo_" . $str;
return new $class();
}
}
class Foo_Bar {
public function baz() {
print "Foo_Bar->baz() was called";
}
}
$Obj = Foo->factory('Bar');
$Obj->baz();
感谢@LazyOne获取链接。
答案 3 :(得分:0)
对我有用的一种方法是在“或”列表中明确列出工厂可能吐出的所有可能的类。
/**
* @param $str
* @return Foo_Bar | Foo_Cad | Foo_Dad
*/
class Foo {
public static function factory($str) {
$class = "Foo_" . $str;
return new $class;
}
}
但这确实意味着实例/对象上的所有方法类型提示都将具有所有列出的类的联合。
不完美,但总比没有好,而且总比在每次发生的情况下都必须多次写入 /* @var ClassA */
好。
答案 4 :(得分:0)
一种方法是在一个“或”列表中明确列出工厂可能吐出的所有可能的类。
<!-- language: lang-php -->
/**
* @param $str
* @return Foo_Bar | Foo_Baz | Foo_Cad
*/
class Foo {
public static function factory($str) {
$class = "Foo_" . $str;
return new $class;
}
}