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

2022-08-30 22:28:21

我经常为对象提供不需要初始化对象的静态方法和属性。例如:

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它是一个字符串,它会通知我是一个无效的方法。另一方面,如果我告诉我的IDE它是SomeObject的一个实例,它认为我可以访问常规的非静态方法和属性,而我不能。getSomeStaticString()


答案 1

PHPStan 为此使用类字符串 PHPDoc 类型。自2020.3以来,PHPStorm一直支持它,但截至2021.2,当他们添加对泛型的支持时,它似乎可以正常工作(所有自动完成功能可用)。

在您的情况下,返回类型注释将是 。@return class-string<SomeObject>


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

enter image description here

抱歉,没有其他方法可以分辨它是 的实例。SomeObject

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

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


2021-10-26更新:从v2020.3开始,PhpStorm捆绑了Psalm SupportPHPStan Support插件。它们支持这些工具支持的大多数语法/类型(您可以在此处查看PhpStorm问题跟踪器以获取这些插件的所有票证(已解决且仍处于待定状态))。

使用这些工具,您可以使用伪类型:class-string


推荐