是否有一个名称空间感知替代PHP的class_exists()?

Ray*_*Ray 12 php namespaces

如果您尝试在PHP的类的方法中使用class_exists(),则必须指定类的全名 - 不遵守当前的命名空间.例如,如果我的班级是:

 <?
    namespace Foo;

    class Bar{
       public function doesBooClassExist(){
            return class_exists('Boo');
       }
    }
Run Code Online (Sandbox Code Playgroud)

Boo是一个类(适当地自动加载)并且看起来像这样

   namespace Foo;

    class Boo{
       // stuff in here
    }
Run Code Online (Sandbox Code Playgroud)

如果我尝试:

$bar = new Bar();
$success = $bar->doesBooClassExist();
var_dump($success);
Run Code Online (Sandbox Code Playgroud)

你会得到一个错误的...有没有另外一种方法来做到这一点,而不必明确指定完整的类名(即class_exits('Foo\Boo'))?

irc*_*ell 24

在5.5之前,最好的方法是始终使用完全限定的类名:

public function doesBooClassExist() {
    return class_exists('Foo\Boo');
}
Run Code Online (Sandbox Code Playgroud)

这并不困难,它使你完全清楚你所指的是什么.记住,你应该追求可读性.命名空间导入对于编写很方便,但会使读取混乱(因为在读取代码时需要记住当前命名空间和任何导入).

然而,在5.5中,有一个新的构造出现:

public function doesBooClassExist() {
    return class_exists(Boo::class);
}
Run Code Online (Sandbox Code Playgroud)

class伪魔术常量可以放到任何标识,它会返回完全限定类名,这将解决以.......

  • 请注意,这不能与动态类名一起使用。它将抛出 **致命错误:编译时 ::class fetch 中不允许动态类名** - 但如果它们驻留在当前命名空间中,您可以手动组装完全限定的类名:`$fqcn = __NAMESPACE__。 '\\'.$class_name` (2认同)