我想确定一个类是否存在以及它是否实现了一个接口。以下两个都应该有效。哪个应该是首选,为什么?
//检查类是否存在,实例化它并找出它是否实现了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}
}
答案 0 :(得分:10)
查看这些功能
我宁愿在Reflection
课程中对这些课程或其实例进行内省。 The Reflection API用于逆向工程类。
还有许多其他有用的原生函数,例如interface_exists或property_exists,etc。
答案 1 :(得分:1)
反思是安全的您可以在不实例化对象的情况下进行验证的最佳方式。但是,如果您不需要对象,如果它不实现Annotation并且对象的创建是更多的资源开销,则不建议创建对象。在这种情况下使用反射技术是有道理的。
如果继续使用该对象是否实现了Annontation,则可以创建该对象并查看它是否实现了Annotation接口。没有最好的方法,相反,你可以考虑最佳实践。
答案 2 :(得分:0)
使用ReflectionClass
是一种更优雅的IMO方式。另外,您不必为了进行检查而实例化您的课程。
答案 3 :(得分:0)
这是通常的方式。我也使用这种方法
if(class_exists($classname)){
$tmp=new $classname;
if($obj instanceof Annotation) {//do something}
}