【发布时间】:2016-10-13 15:05:21
【问题描述】:
在我正在进行的现有项目中,我们有以下情况:
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,检查应该返回 true,对于 $C,应该返回 false。通常你会这样做
if( $C instanceof A ) { //do the work }
但在我们的情况下,这将返回不应该的 true。
一种方法可以是解析文件并测试该类是否真的使用token_get_all 函数实现了A。但在此之前,我想问一下是否有更优雅的解决方案。
我知道这听起来很奇怪,但情况就是这样,无法更改类层次结构。任何见解都会有所帮助。
【问题讨论】:
-
如果 B 实现了 A,难道不是所有扩展 B 的类都会自动实现 A 吗?
-
是的,但我只需要实际具有 implements A 语句的类。给出层次结构是因为它是一个旧的遗留系统。
-
but I need only classes which actually have the implements A statement你能解释一下吗? -
真实世界的场景是我有一个表单字段列表。其中之一是列表表单域。许多其他表单字段确实从该列表字段扩展而来。但我只想要实现 A 的特定的,因为它们在我使用它们的上下文中是有意义的。
标签: php class inheritance interface