【问题标题】:Discover all class implementing an interface发现所有实现接口的类
【发布时间】:2012-03-06 08:42:12
【问题描述】:

您好,我正在使用 symfony2 框架来制作网站。我在 PHP 中定义了一个接口,例如:

interface AdminPluginInterface {
    public function getName();
}

现在我想知道所有可以由 Symfony2 UniversalClassLoader 加载的实现我的接口的类,以便像这样使用它们:

foreach ($classes as $class)
{
    $class->getName();
}

感谢您的回答!

【问题讨论】:

  • Symfony 不能知道你所有的类。当您开始使用未定义的类时,Autoloader 会猜测文件的路径。您需要手动遍历项目中的所有文件并检查其中的类是否实现了接口。这并不容易。你需要它做什么?也许您可以使用其他解决方案?

标签: php symfony


【解决方案1】:

尝试使用is_a()函数:

foreach ($classes as $class)
{
    $classname = $class->getName();
    var_dump(is_a($classname,'AdminPluginInterface'));
}

欲了解更多信息,请查看:

【讨论】:

  • 可能写的不好,我想获取数组$classes中实现该接口的类列表@
【解决方案2】:

由于这些类只有在使用时才会自动加载,因此您无法在源代码中列出所有类。您只能通过调用get_declared_classes 获取已使用的类。 一种解决方案是指定一个插件目录并扫描它的类文件,导入它们,然后检查这些类是否使用class_implements 实现您的接口 查看this question answers 的一些代码示例,以扫描您的接口是否由某个声明的类实现

【讨论】:

  • +1 指出您不能列出源代码中的所有类,而只能列出当前加载的类,如果您不知道如何自动加载器工作。
【解决方案3】:

这有点老了,但我认为

class_implements()

是你需要的:)

【讨论】:

  • class_implements 不会按照要求搜索所有类。
猜你喜欢
  • 2014-04-05
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多