我想在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
首先触发自动加载?
答案 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。
它能回答你的一些问题吗?它有帮助吗?