如何告诉phpDoc一个字符串是一个类名?

时间:2014-10-25 14:53:22

标签: php phpstorm phpdoc

我经常给对象静态方法和属性,不需要初始化对象。例如:

class SomeObject {
    public function __construct($object_id) {
        $this->loadProperties($object_id);
    }

    public static function getSomeStaticString() {
        return "some static string";
    }
}

现在我们对这些对象进行子类化,并使用某种控制器在某些情况下返回对象类字符串,在这种情况下,对象尚未初始化。例如:

class SomeObjectController {
    public function getSomeObjectWithTheseProperties(array $properties) {
        if($properties[0] === "somevalue") {
            if($properties[1] === "someothervalue") {
                return SomeSubclassObject::class;
            }

            return SomeObject::class;
        }

        return NULL;
    }
}

有时我可能想要在不实际初始化对象的情况下调用静态函数SomeObject::getSomeStaticString()(因为这会涉及不需要的数据库提取)。例如:

$controller = new SomeObjectController;
$properties = array("somevalue", "someothervalue");
$object_class = $controller->getSomeObjectWithTheseProperties($properties);

echo $object_class::getSomeStaticString();

问题:我能以某种方式告诉PhpStorm,最好是通过phpDoc,$object_classSomeObject的子类的类字符串吗?

如果我告诉我的IDE它是一个字符串,它会通知我getSomeStaticString()是一种无效的方法。另一方面,如果我告诉我的IDE它是SomeObject的一个实例,它认为我可以访问常规的非静态方法和属性,我不能这样做。

4 个答案:

答案 0 :(得分:1)

/** @var SomeObject $object_class */
$object_class = $controller->getSomeObjectWithTheseProperties($properties);

enter image description here

很抱歉,没有其他方法可以说明它是SomeObject的实例。

  

...如果我告诉我的IDE它是SomeObject的一个实例,它认为我可以访问常规的非静态方法和属性,我不能这样做。

所以?只是不要访问非静态方法和属性。

答案 1 :(得分:1)

PHPStan为此使用class-string PHPDoc类型。您可以使用此plugin在PHPStorm中获得自动完成支持。

答案 2 :(得分:0)

您也可以使用以下解决方法:

/**
 * @return string|SomeObject
 */
public function getSomeObjectClass()
{
    return SomeObject::class;
}

答案 3 :(得分:0)

如果您想要完美的类型提示,您可以创建一个只列出类的静态方法(和属性)的接口,并将该接口用作 SomeObjectController::getSomeObjectWithTheseProperties() 返回的类名字符串的类型提示。

它增加了维护开销以确保接口和类保持同步,但如果您需要这些类型提示才能正常工作,这就是方法。