有没有一种方法可以在PHP中为以后的继承提供抽象保护的静态方法


Is there a way for abstract protected static method in PHP for later inheritance?

我已经读过为什么PHP 5.2+不允许抽象静态类方法?以及如何强制实现受保护的静态函数——第二个与我的情况非常相似——但我仍然没有答案。基本上,我想保证,我的抽象类的每个孩子都有受保护的静态方法的实现,而没有实现它,因为这没有意义,也因为那里缺乏关键信息。此外,它必须是静态的(因为调用者方法是静态的,并且它没有上下文)和受保护的(所以我不能使用接口,我不希望任何人直接调用它),并且它将由后期静态绑定调用。有什么想法吗?

下面的伪代码说明了我的情况:

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);

我唯一的解决方案是在基类中实现受伪保护的静态方法,并抛出一个泛型异常,这样它就必须通过继承来实现。

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

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 {...}