使用SomeClass::class
语法获取类的FQN时,如果该类不存在,则只输出SomeClass
而不是抛出致命错误。
echo SomeClass::class; // SomeClass
$class = new SomeClass(); // Fatal Error: Uncaught Error: Class 'SomeClass' not found
$const = SomeClass::SOME_CONST; // Fatal Error: Uncaught Error: Class 'SomeClass' not found
这对我来说似乎不受欢迎。为什么会发生这种情况,有没有办法改变这种行为?
答案 0 :(得分:2)
::class
- 关键字在编译时评估
来自manual
使用
::class
的类名解析是编译时 转型。这意味着当时类名字符串是 创建没有自动加载已经发生。因此,班级名称 即使该类不存在,也会扩展。没有发出错误 那种情况。
这意味着,使用::class
并不会调用自动加载器,也不会抛出错误。要调用自动加载器,您必须创建该类的实例或使用任何调用自动加载器的函数(即class_exists
)
你可以通过定义一个简单的测试函数来解决这个问题,但我不确定,如果这是一个很大的好处。
function class_or_fail($name) {
if (class_exists($name)) {
return $name;
}
throw new \Exception("Invalid class $name");
}
echo class_or_fail(SomeClass::class);
答案 1 :(得分:0)
实际上不需要定义类来确定其FQN。这只是使用您所在的命名空间或匹配任何use
语句的问题。如果你想确定这个类是否真的存在,那就有一个函数 - class_exists()
。