我有一个PHP对象,它由一组类组成。为了简单起见,我们将它称为类C的对象,它扩展了类B,后者又扩展了类A.在我的代码中的某些时候,我想通过调用它继承自接口I的doCleanup()函数来清理对象。 :
interface I { public function doCleanup(); }
class A implements I { ... }
class B extends A { ... }
class C extends B implements I { ... }
在C类的doCleanup函数中,我想在我的父类中执行任何清理函数(在本例中,是类A中的doCleanup())。但是,对于某些对象,我不确定是否有任何父类实际实现了接口I,因此我不确定是否可以简单地调用parent::doCleanup()
。
因此,我的问题是,是否有办法检查我的祖先是否通过使用某种instanceof
调用来实现界面?
答案 0 :(得分:2)
你可以很好地使用get_parent_class
和is_subclass_of
(适用于接口和父类):
<?php
interface I {
public function doCleanup();
}
class A implements I {
public function doCleanup() {
echo "done cleanup\n";
}
}
class B extends A {}
class C extends B implements I {
public function doCleanup() {
if (is_subclass_of(get_parent_class($this), 'I')) {
parent::doCleanup();
}
}
}
$c = new C;
$c->doCleanup(); // outputs "done cleanup"
答案 1 :(得分:0)
由于C类扩展了B,并且B扩展了A,并且需要A来实现doCleanup
,所以从逻辑上讲,您可以在C中调用parent::doCleanup()
并且它将起作用。如果B没有实现它,它将被传递给A,它必须实现它。更确切地说,B将使用A的实现来运行它。
如果您不知道A是否实施了我,那么它不会必然是您的责任。例如,如果它是库代码,则docs可能会告诉您应该做什么。