有没有办法在PHP中使用抽象保护的静态方法来进行后续继承?

时间:2015-12-28 14:03:48

标签: php oop inheritance static-methods abstract

我已经阅读了Why does PHP 5.2+ disallow abstract static class methods?How to force an implementation of a protected static function - 第二个与我的情况非常相似 - 但我仍然没有回答。基本上,我想保证,我的抽象类的每个子节点都实现了受保护的静态方法,而没有实现它,因为它没有任何意义,并且由于缺少关键信息。此外,它必须是静态的(因为调用方法是静态的,它没有上下文)和受保护(因此我不能使用接口,我不希望任何人直接调用它),并且它将被后期静态绑定调用。有什么想法吗?

下面的虚拟代码照亮了我的案例:

abstract class BaseClass {

    public static function foo() {
        // some common stuff
        static::bar();
        // rest of common stuff
    }

    public function whoooaaa($condition) {
        if ($condition) {
            AClass::foo();
        } else {
            BClass::foo();
        }
    }
}

class AClass extends BaseClass {

    protected static function bar() {
        // do something
    }
}

class BClass extends BaseClass {

    protected static function bar() {
        // do something else
    }
}

// end somewhere else in my code, two constructions, both used:
AClass::foo();
// ....
$baseClassInheritedInstance->whoooaaa($variableCondition);

我唯一的解决方案是丑陋的,是在基类中实现虚拟保护静态方法并抛出一个通用异常,因此它必须通过继承来实现。

1 个答案:

答案 0 :(得分:0)

您可以添加一个静态工厂,它将填充临时对象的上下文。

class Factory() {
    public static getObject($condition) {
        $object = $condition ? new A() : new B();
        // you can fill context here and/or use singleton/cache
        return $object;
    }
}

abstract class Base {
    abstract function concreteMethod();
}

class A extends Base {...}
class B extends Base {...}