工厂的PhpStorm类型提示?

时间:2013-07-16 01:41:43

标签: factory phpstorm type-hinting

我的代码或多或少是这样的:

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了解$ObjFoo_Bar对象,因此,例如,如果我输入$Obj->razrazzle()将显示自动完成。< / p>

有没有办法得到这个?告诉PhpStorm函数Foo::factory($str)返回类型为Foo_$str的对象?我的猜测是答案是否定的。

5 个答案:

答案 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;
    }
}