将功能传播给父母

时间:2011-01-25 14:05:43

标签: php inheritance instanceof

我有一个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调用来实现界面?

2 个答案:

答案 0 :(得分:2)

你可以很好地使用get_parent_classis_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可能会告诉您应该做什么。