Php 是否应该使用反射或实例化来确定类是否存在并实现接口?
我想确定一个类是否存在,以及它是否实现了一个接口。以下两种方法都应该有效。应该选择哪一种?为什么 //检查类是否存在,实例化它并确定它是否实现了注释Php 是否应该使用反射或实例化来确定类是否存在并实现接口?,php,oop,reflection,Php,Oop,Reflection,我想确定一个类是否存在,以及它是否实现了一个接口。以下两种方法都应该有效。应该选择哪一种?为什么 //检查类是否存在,实例化它并确定它是否实现了注释 if(class_exists($classname)){ $tmp=new $classname; if($obj instanceof Annotation) {//do something} } if(class_exists($classname)){ $r=new new ReflectionClass(
if(class_exists($classname)){
$tmp=new $classname;
if($obj instanceof Annotation) {//do something}
}
if(class_exists($classname)){
$r=new new ReflectionClass($classname);
if($r->implementsInterface('Annotation)) {//do something}
}
//检查类是否存在,对其进行反射,并确定它是否实现了注释
if(class_exists($classname)){
$tmp=new $classname;
if($obj instanceof Annotation) {//do something}
}
if(class_exists($classname)){
$r=new new ReflectionClass($classname);
if($r->implementsInterface('Annotation)) {//do something}
}
反射是在不实例化对象的情况下进行验证的最佳安全方法。但是,如果不需要对象(如果对象未实现注释),则不建议创建对象,并且创建对象会增加资源开销。在这个场景中使用反射技术是有意义的
如果无论对象是否实现注释,都要继续使用该对象,则可以创建该对象并查看它是否实现注释接口。没有最佳方法,相反,您可以考虑最佳实践。在我看来,使用
ReflectionClass
是一种更优雅的方法。此外,您不必仅为了进行检查而实例化类。这是一种常见的方法。我也用这个方法
if(class_exists($classname)){
$tmp=new $classname;
if($obj instanceof Annotation) {//do something}
}
查看这些函数
- 返回由给定类实现的接口
- 返回给定类的父类
- 检查对象是否属于此类,或者是否将此类作为其父类之一
反射类。是逆向工程课程
还有许多其他用户本机函数,如或。您是否有实例(或将创建实例)?还是只检查班级?有时,由于副作用、受保护的构造函数、延迟加载等原因,创建对象不是一个选项。我试图延迟创建实例,直到实际需要它。一个未初始化的实例(比如$tmp
)并不太糟糕,但是一个初始化的实例可能非常大。与这个简单的函数调用相比,ReflectionClass似乎有点过头了:)非常好!我怎么会错过这些函数呢?关键是接口不依赖于类的遗传。在PHP(AFAIK)中,接口不作为第一类实体存在,因此这些函数的行为可能与您期望的不同。e、 g.dog、mouse和cat可能实现一个公共接口,但可能没有公共基类。C.@symcbean嗯,你的意思是?我希望这些功能能够按照手册和上面给出的说明执行。不多不少。没有人说接口的工作原理与继承相同。