单身人士遗产

时间:2008-11-30 21:27:59

标签: php singleton

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

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

2 个答案:

答案 0 :(得分:4)

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

PHP 5.3现在支持后期静态绑定,它可以让你做你需要的,但在此之前还有一段时间可以广泛使用。查看一些信息here

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

答案 1 :(得分:1)

静态方法与其定义类型绑定,而不是实例。子类不继承静态方法(这没有意义)。它们仍与父类型相关联。因此,绑定到父类型的GET方法将无法确定您想要获得哪种类型的子类型。我担心每个孩子班级都必须实施自己的GET方法。