2016-06-13 94 views
0

现有项目我的工作,我们有以下的情况:PHP检查是否实际类实现接口

interface A { } 

class B implements A { } 

class C extends B { } 

class D extends B implements A { } 

$B = new B(); 
$C = new C(); 
$D = new D(); 

什么是要弄清楚,如果实际的类实现接口的正确方法A而不仅仅是父类?支票应该返回真实为$ B和$ D和为$ C.通常情况下,你会这样做

if($C instanceof A) { //do the work } 

但在我们的情况下,这将返回true,不应该。

一种方法可以是解析文件并测试该类是否真正实现了A与token_get_all函数。但在这之前,我想问问是否有更优雅的解决方案。

我知道这听起来很奇怪,但情况是如此,并且类层次结构无法更改。任何见解都会有所帮助。

+0

如果B实现了A,那么所有扩展B的类都不会自动实现A吗? – Guiroux

+0

是的,但我只需要实际具有实现A语句的类。给出层次结构是因为它是一个旧的遗留系统。 – Laoneo

+0

'但我只需要实际具有实现语句的类'你能解释一下这个问题而不用深入解释吗? – Guiroux

回答

0

只有在接口A不通过父类扩展的情况下,此函数才返回true。

echo checkimplements($B, "A"); //Returns True 

function checkimplements($class, $interfacename) 
{ 
    $ownInterfaces = class_implements($class); 
    $parent = get_parent_class($class); 
    if($parent) { 
     $parentInterfaces = class_implements($parent); 
    } else { 
     $parentInterfaces = array(); 
    } 
    $diff = array_diff($ownInterfaces, $parentInterfaces); 
    $found = in_array($interfacename, $diff); 
    return $found; 
} 
+0

但是它也返回false。 – Laoneo

相关问题