【发布时间】:2012-01-21 15:39:50
【问题描述】:
我想获取 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 先触发自动加载?
【问题讨论】:
-
在get_declared_classes不包含Event的场景下,是否加载了Event代码?换句话说,是否包含了包含 Event 的类声明的文件(或者已经在代码流中定义了)?
-
我没有费心去测试,但我认为这可能是因为你已经使用 use 语句引用了一个 NS,并且数组中的类名将是具有命名空间的完全限定类名。这样虽然
new Event可能会起作用,但它确实引用了\Some\OtherNamespace\Event。 -
@Corbin 事件代码肯定已加载。如果没有,
$x = new Event()会失败,对吧? -
@prodigitalson 我目前没有使用命名空间。
-
@Ryan:不,调用
$x = new Event()可能会使用自动加载然后加载Event类的代码。
标签: php oop reflection namespaces