2

我有一个由一组类组成的 PHP 对象。为简单起见,我们称它为扩展类 B 的类 C 的对象,而类 B 又扩展类 A。在我的代码中的某个时刻,我想通过调用它从接口 I 继承的 doCleanup() 函数来清理对象:

interface I { public function doCleanup(); }

class A implements I { ... }
class B extends A { ... }
class C extends B implements I { ... }

在 CI 类的 doCleanup 函数中,还希望在我的父类中执行任何清理函数(在本例中,是 A 类中的 doCleanup())。但是,对于某些对象,我不确定是否有任何父类实际上实现了接口 I,所以我不确定我是否可以简单地调用parent::doCleanup().

因此,我的问题是,是否有办法检查我的祖先是否实现了该接口,例如通过使用某种instanceof调用?

4

2 回答 2

2

get_parent_class你可以用and很好地做到这一点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"
于 2011-01-25T14:21:37.220 回答
0

由于类 C 扩展了 B,B 扩展了 A,并且需要 A 来实现doCleanup,所以逻辑上你可以调用parent::doCleanup()C 并且它会起作用。如果 B 没有实现它,它将被传递给 A,A 必须实现它。更准确地说,B 将使用 A 的实现来运行它。

如果您不知道 A 是否实现了 I,那么调用它不一定是您的责任。例如,如果它是库代码,文档可能会告诉您应该做什么。

于 2011-01-25T14:11:04.607 回答