【问题标题】:Propagating a function to parents将函数传播给父母
【发布时间】:2011-01-25 14:05:43
【问题描述】:

我有一个由一组类组成的 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 { ... }

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

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

【问题讨论】:

    标签: php inheritance instanceof


    【解决方案1】:

    您可以使用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 如果method_exists() 不起作用,那将是我的第二个建议:-)
    【解决方案2】:

    既然类C扩展了B,B扩展了A,而A需要实现doCleanup,那么逻辑上你可以在C中调用parent::doCleanup(),它就可以工作。如果 B 没有实现它,它将被传递给 A,A 必须实现它。更准确地说,B 将使用 A 的实现来运行它。

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

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 2018-09-08
      • 2016-12-25
      • 2022-08-24
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多