PHP中的几乎最终方法?

时间:2012-08-16 17:30:50

标签: php inheritance override final

我在继承链中有两个抽象类,最终将成为通用库:

abstract class Foo {
    public function baz() {
        echo 'Foo::baz()';
    }

    // other methods here
}

abstract class Bar extends Foo {
    public function baz() {
        echo 'Bar::baz()';
    }
}

这两个类是由开发人员扩展的,我的问题是我想这样做,以便不能覆盖baz()方法的实现(因为它们包含严格的RFC兼容代码) )。制作Bar::baz() final没问题;但是,如果我Foo::baz() final,那么Bar本身显然也无法覆盖它。

PHP 5.4的trait可能会提供一个实用的解决方案,但我不能放弃对PHP的支持< 5.4这个。我的最后一招是让它保持原样,并使用文档警告开发人员不要覆盖这种方法,但如果可能的话,我想找到更具体的东西。

我是否可以使用任何其他设计来强制执行这两个方法不应被覆盖,同时保持代码DRY(例如不删除继承并复制所有代码)?

2 个答案:

答案 0 :(得分:2)

我想我有办法做到这一点。它比一个非常简洁的设计更具诀窍,但我认为我明白了这一点。

abstract class Foo {
private $bazBehaviour;
    public function __construct($bazBehaviour){
        $this->bazBehaviour=!empty($bazBehaviour)?$bazBehaviour:"defaultBazBehaviour";
    }
   final public function baz() {
       $this->bazBehaviour();
   }
   final protected function defaultBazBehaviour(){
        echo "Foo::Baz()";
    }
   // other methods here
}

abstract class Bar extends Foo {
    public function __construct(){
       parent::__construct("bazBehaviour");
    }
    final protected function bazBehaviour() {
        echo 'Bar::baz()';
     } 
}
class toto extends Bar{
     public function __construct(){
       parent::__construct();
    }
}
$d = new toto();
$d->baz();

使用PHP 5.3.13发送: 酒吧::巴兹()

答案 1 :(得分:0)

很抱歉,您的要求是矛盾的:

my problem is that I'd like to make it so that neither implementation of 
the baz() method can be overridden

但是 会覆盖Foo:baz()中的Bar ..因此,此处的设计/要求存在一些基本问题。