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

时间:2011-12-16 00:56:10

标签: 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(); }

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

$class_name = 'Event';
if (!in_array($class_name, get_declared_classes())) {
    $x = new $class_name();
};

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

有些类可能不会出现在get_declared_classes()的结果中,因为在调用此函数时可能无法加载它们。在尝试实例化它们之后,如果它们自动加载,可能就是这种情况。有关自动加载课程的详情,请参阅:php.net/autoload

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