在php中是否可以获得使用特定特性的类的列表


is it possible in php to get a list of classes that use a particular trait?

我想得到一个使用特定特性的类的列表,例如:

trait Baz { }
class Foo { use Baz; }
class Bar { use Baz; }

$classes = getClassesThatUseTrait('Baz');
// $classes is ['Foo', 'Bar']

有可能吗?

您可以执行类似的操作

trait foo { }
class bar {
  use foo;
}
class bar2 {
}
$trait = 'foo';
// get user defined classes
$definedClasses = array_filter(
   get_declared_classes(),
   function($className) {
       return !call_user_func(
           array(new ReflectionClass($className), 'isInternal')
       );
   }
);
// select only classes that use trait $trait    
$classes = array_filter(
   $definedClasses,
   function($className) use($trait) {
     $traits = class_uses($className);
     return isset($traits[$trait]);
   }
);
var_dump($classes);

反射包有以下处理特征的方法:

  • ReflectionClass::getTraitAliases
  • ReflectionClass::getTraitNames
  • ReflectionClass::getTraits
  • ReflectionClass::isTrait

不存在"获取所有使用trait X的类"方法。

如果您有代码定义的所有类的列表,那么您可以使用上面提到的方法之一(例如ReflectionClass::getTraits),然后将该类使用的特征与您要查找的特征进行比较。但是,您必须加载应用程序中的所有类,这不是很有效或实用。

如果您可以将搜索限制在类的一小部分,那么这样做可能效果相当好。

我想知道你为什么觉得你需要做这样的事情。这不是人们通常会做的事情。这很奇怪。