Распространение функции для родителей - PullRequest
2 голосов
/ 25 января 2011

У меня есть объект PHP, который состоит из набора классов. Для простоты давайте назовем его объектом класса C, который расширяет класс B, который, в свою очередь, расширяет класс A. В какой-то момент в моем коде я хочу очистить объект, вызвав его функцию doCleanup (), которую он наследует от интерфейса I :

interface I { public function doCleanup(); }

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

В функции doCleanup класса C я также хочу выполнить любую функцию очистки в моих родительских классах (в данном случае doCleanup () в классе A). Однако для некоторых объектов я не уверен, реализует ли какой-либо родительский класс интерфейс I, поэтому я не уверен, могу ли я просто вызвать parent::doCleanup().

Поэтому мой вопрос: есть ли способ проверить, реализует ли кто-нибудь из моих предков интерфейс, например, с помощью какого-то вызова instanceof?

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Вы можете сделать это красиво с 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"
0 голосов
/ 25 января 2011

Поскольку класс C расширяет B, а B расширяет A, а для реализации doCleanup требуется A, то логически вы можете вызвать parent::doCleanup() в C, и это будет работать.Если B не реализует это, оно будет передано A, который должен его реализовать.Точнее, B запустит его, используя реализацию A.

Если вы не знали, реализовал ли A I или нет, то вы не должны обязательно отвечать за его вызов.Например, если бы это был библиотечный код, документы могли бы сказать вам, что вы должны делать.

...