【问题标题】:Singleton heritage单身遗产
【发布时间】:2010-09-24 16:04:57
【问题描述】:

这里解释了单例: http://en.wikipedia.org/wiki/Singleton_pattern#PHP_5。 我想将单例类用作超类,并将其扩展到其他应该是单例的类中。问题是,超类创建了自己的实例,而不是子类。知道如何让超类创建子类的实例吗?

 class Singleton {

    // object instance
    private static $instance;

    protected function __construct() { }
    public function __clone() { }
    public function __wakeup() { }

    protected static function getInstance() {
        if (!self::$instance instanceof self) { 
            self::$instance = new self;

            if(self::$instance instanceof Singleton)
                echo "made Singleton object<br />";

            if(self::$instance instanceof Text)
                echo "made Test object<br />";
        }
        return self::$instance;
    }

}


class Test extends Singleton {

    private static $values=array();

    protected function load(){
        $this->values['a-value'] = "test";
    }

    public static function get($arg){
        if(count(self::getInstance()->values)===0)
            self::getInstance()->load();

        if(isset(self::getInstance()->values[$arg]))
            return self::getInstance()->values[$arg];

        return false;
    }
}

【问题讨论】:

    标签: php singleton


    【解决方案1】:

    静态方法与其定义类型相关联,而不是实例。子类不继承静态方法(这没有意义)。它们仍然与父类型相关联。因此,与父类型绑定的 GET 方法将无法确定您只想获取哪种子类型。恐怕每个子类只需要实现自己的 GET 方法。

    【讨论】:

    • 实际上,5.3 中有一个叫做“后期静态绑定”的 hack,但这并不意味着使用它是一个好主意。
    【解决方案2】:

    这是 PHP 的一个限制 - 父类无法确定静态调用其方法的子类的名称。

    PHP 5.3 现在支持后期静态绑定,这将使您可以做您需要做的事情,但要广泛使用还需要一段时间。看一些资料here

    这里有几个类似的问题可能值得一读以了解可能的解决方法,例如this one

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多