PHP检查是否实际类实现接口
问题描述:
现有项目我的工作,我们有以下的情况: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函数。但在这之前,我想问问是否有更优雅的解决方案。
我知道这听起来很奇怪,但情况是如此,并且类层次结构无法更改。任何见解都会有所帮助。
答
只有在接口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
如果B实现了A,那么所有扩展B的类都不会自动实现A吗? – Guiroux
是的,但我只需要实际具有实现A语句的类。给出层次结构是因为它是一个旧的遗留系统。 – Laoneo
'但我只需要实际具有实现语句的类'你能解释一下这个问题而不用深入解释吗? – Guiroux