【问题标题】:Is there a way for abstract protected static method in PHP for later inheritance?有没有办法在 PHP 中抽象受保护的静态方法以供以后继承?
【发布时间】:2016-04-02 09:21:53
【问题描述】:

我已经阅读了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);

我唯一的解决方案,丑陋的,是在基类中实现 dummy protected static 方法并抛出一个泛型异常,所以它必须通过继承来实现。

【问题讨论】:

  • 这个例子显然很dummy,我需要使用的构造很复杂,例如BaseClass::foo中的常见代码包含一些循环和条件,所以没有简单的方法来重构它.
  • 另外,在大多数情况下,我想使用 BaseClass::foo 或 BaseClass::whoooaaa 的静态等价物来以静态方式使用速记的继承;)
  • 这里真正的问题是:为什么以悟空的名义创建静态继承关系?难道没有更好的方法吗?
  • 你能解释一个实际的用例吗?老实说,我无法想象这种构造可能有用的单一案例。

标签: php oop inheritance static-methods abstract


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2019-02-10
    • 2013-12-14
    • 2017-11-28
    • 2017-06-14
    相关资源
    最近更新 更多