如何在 >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()
的内容,从语法上讲是对静态函数的调用。正如您注意到的那样 - 效果非常好。
正如预期的那样,下面的示例不起作用,但我如何告诉 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()
的内容,从语法上讲是对静态函数的调用。正如您注意到的那样 - 效果非常好。