使用:: class时,为什么PHP不会抛出class not found错误?

时间:2017-04-28 13:15:33

标签: php

使用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

这对我来说似乎不受欢迎。为什么会发生这种情况,有没有办法改变这种行为?

2 个答案:

答案 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()