2

クラスのセットで構成されるPHPオブジェクトがあります。簡単にするために、クラスBを拡張するクラスCのオブジェクトと呼び、次にクラス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が必要なので、論理的にはCをdoCleanup呼び出すことができ、それは機能します。parent::doCleanup()Bがそれを実装しない場合、それはAに渡され、Aはそれを実装する必要があります。より正確には、BはAの実装を使用してそれを実行します。

AがIを実装したかどうかわからない場合は、必ずしもそれを呼び出すのはあなたの責任ではありません。たとえば、それがライブラリコードの場合、ドキュメントはあなたが何をすべきかを教えてくれるかもしれません。

于 2011-01-25T14:11:04.607 に答える