17

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

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()将显示为自动完成。

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

4

5 回答 5

13

据我所知,您无法让 PHPStorm 了解 Foo 给出的内容,因为它是动态的。但是,您可以肯定地告诉 PHPStorm 您的 $Obj 变量是什么,方法是在其上方放置一个 doc 注释,如下所示:

/** @var Foo_Bar $Obj */
$Obj = Foo::factory('Bar');
于 2013-07-16T08:36:59.470 回答
9

是的,如果您的工厂是静态方法,您可以这样做。对于您提供的示例,它应该可以正常工作。

更多细节和一些基本示例可以在这里找到:http ://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

于 2013-07-16T08:48:19.410 回答
4

您应该使用适用于动态和静态调用的 phpstorm 元数据。

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();  

在项目根目录中创建一个文件并将其命名.phpstorm.meta.php

<?php

namespace PHPSTORM_META {
    $STATIC_METHOD_TYPES = [
        \Foo::factory('') => [
            "Bar" instanceof \Foo_Bar,
        ],
    ];
}

感谢@LazyOne 提供链接。

于 2015-11-30T07:33:34.733 回答
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 */每次发生时都要写多次要好。

于 2021-02-13T05:30:39.207 回答
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;
    }
}
于 2021-02-13T05:32:54.560 回答