是否有可能在PHP中获取使用特定特征的类列表?

时间:2014-10-27 04:26:40

标签: php traits

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

trait Baz { }

class Foo { use Baz; }

class Bar { use Baz; }


$classes = getClassesThatUseTrait('Baz');

// $classes is ['Foo', 'Bar']

有可能吗?

2 个答案:

答案 0 :(得分:1)

你可以做这样的事情

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);

答案 1 :(得分:0)

嗯,反射包有这些处理特征的方法:

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

没有"得到所有使用特征X"方法

如果你有一个代码定义的所有类的列表,那么你可以使用上面提到的方法之一(例如ReflectionClass::getTraits),然后比较类所使用的特征,你正在寻找的特质。但是,您必须加载应用程序中的所有类,这不是非常有效或实用。

如果您可以将搜索范围限制在类的一小部分,那么执行此类操作可能会相当有效。

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