如何在 >php7.1 中将 className 转换为未实例化的 class

How to transform a className to uninstantiated class in >php7.1

正如预期的那样,下面的示例不起作用,但我如何告诉 php 我的 classname-string 应该是未实例化的 class? 我知道我可以使用一些技巧来解决问题,但是有正确的方法吗?

感谢 magnus 我想补充一点,在使用中我不想在函数中硬编码 class 名称它可以是任何东西但注意它存在等不是问题的一部分.

(对于 php>7.1)

另一个方向适用于 get_class

Interface iFoo {
    static function getBar(): string;
}
class Foo implements  iFoo {
    private static $bar = "`My test value`";
    static function getBar(): string {
        return self::$bar;
    }
}

function getMyClass() : iFoo {
    $classes = array('Foo');
    print "this works: ".$classes[0]::getBar();
    // return failes
    print "this does not:";
    return $classes[0];
}

输出:

this works: `My test value`this does not:

Fatal error:  Uncaught TypeError: Return value of getMyClass() must implement interface iFoo, string returned

我知道它可以与 : iFoo | string 一起使用,但是类型提示已过时。我缺少类似 make-class-of-string() 函数的东西。

提前感谢您的帮助:)

没有办法。

return 类型是实例的一种类型(无论是复杂类型还是原始类型)。内存中存在的东西。

::class 关键字是一个简单的助手,它解析为 class 的完全限定名称,它是一个字符串(原始类型)。

return 类型是对象的一种类型,而不是实例化时的特定类型。并且没有什么技巧可以说“在实例化时,这个字符串将是 Foo 类型”。

$classes[0]::getBar() 结构之所以有效,是因为它是一种语法糖。 PHP 将其解析为类似 Foo::getBar() 的内容,从语法上讲是对静态函数的调用。正如您注意到的那样 - 效果非常好。