是否应使用反射或实例化来确定类是否存在并实现接口?

时间:2010-01-12 14:49:49

标签: php oop reflection

我想确定一个类是否存在以及它是否实现了一个接口。以下两个都应该有效。哪个应该是首选,为什么?

//检查类是否存在,实例化它并找出它是否实现了Annotation

  if(class_exists($classname)){
   $tmp=new $classname;
   if($obj instanceof Annotation) {//do something}
  }

//检查类是否存在,对其进行反映并找出它是否实现了Annotation

  if(class_exists($classname)){
   $r=new  new ReflectionClass($classname);
   if($r->implementsInterface('Annotation)) {//do something}
  }

4 个答案:

答案 0 :(得分:10)

查看这些功能

我宁愿在Reflection课程中对这些课程或其实例进行内省。 The Reflection API用于逆向工程类

还有许多其他有用的原生函数,例如interface_existsproperty_existsetc

答案 1 :(得分:1)

反思是安全的您可以在不实例化对象的情况下进行验证的最佳方式。但是,如果您不需要对象,如果它不实现Annotation并且对象的创建是更多的资源开销,则不建议创建对象。在这种情况下使用反射技术是有道理的。

如果继续使用该对象是否实现了Annontation,则可以创建该对象并查看它是否实现了Annotation接口。没有最好的方法,相反,你可以考虑最佳实践。

答案 2 :(得分:0)

使用ReflectionClass是一种更优雅的IMO方式。另外,您不必为了进行检查而实例化您的课程。

答案 3 :(得分:0)

这是通常的方式。我也使用这种方法

if(class_exists($classname)){
   $tmp=new $classname;
   if($obj instanceof Annotation) {//do something}
  }