Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否应该使用反射或实例化来确定类是否存在并实现接口?_Php_Oop_Reflection - Fatal编程技术网

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嗯,你的意思是?我希望这些功能能够按照手册和上面给出的说明执行。不多不少。没有人说接口的工作原理与继承相同。