在PHP中,有没有办法在特定的命名空间中获取所有声明的类?

ryb*_*ome 5 php oop reflection namespaces

我想在PHP中获取特定命名空间中所有类的名称.目前,我试图通过对特定命名类列表的反射来做一些魔术,但我想在不知道名字的情况下这样做.

我试过打电话get_declared_classes(),但无论出于什么原因,我所提供的课程都没有出现.我可以打电话get_declared_classes(),不在Event列表中看到,然后马上打电话$x = new Event()没问题.像下面的东西,我认为应该导致问题...

if (! in_array('Event', get_declared_classes())) { $x = new Event(); }
Run Code Online (Sandbox Code Playgroud)

...工作良好.我想知道命名空间这些类并检索这种方式是否有助于缓解问题.这可能吗?

编辑:为了澄清,让我补充一点,我目前没有使用命名空间,我并没有特别尝试从上面列出的代码中获得一些东西.我想要的是获取我声明的所有类的名称.尽管在我打电话之前所有人的类声明都被击中get_declared_classes(),但它们并没有全部出现在列表中.我希望命名空间可以帮助解决问题.

编辑2:有几个人指出这些类可能是自动加载的.我通过执行以下操作来测试它.echo(class_exists('Event'))返回值1.echo(class_exists('Event', FALSE))返回值0. class_exists的第二个可选参数是是否自动加载.所以,显然这个课程正在自动加载.这回答了这一点.

那么,下一个问题 - 我该如何防止这种情况发生?我使用的框架实际上并没有给我很多低级别的控制权.有没有办法强制自动加载,然后调用get_declared_classes,或者get_declared_classes首先激活自动加载?

Tad*_*eck 5

您不需要在代码中对其进行硬编码,您可以使用变量名称:

$class_name = 'Event';
if (!in_array($class_name, get_declared_classes())) {
    $x = new $class_name();
};
Run Code Online (Sandbox Code Playgroud)

请参阅此处的类似代码:codepad.org/hCLE4ToA.

此外,某些类可能不会出现在get_declared_classes()结果中,因为在调用此函数时可能无法加载它们.在尝试实例化它们之后,它们可能是自动加载的.在这里查看有关自动加载类的更多信息:php.net/autoload.

它能回答你的一些问题吗?它有帮助吗?