3

这里解释了单例: 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;
    }
}
4

2 回答 2

4

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

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

这里有几个类似的问题,对于可能的解决方法可能值得一读,例如这个

于 2008-11-30T22:10:48.200 回答
1

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

于 2008-11-30T21:36:25.380 回答