Синглтонское наследие - PullRequest
3 голосов
/ 01 декабря 2008

Синглтон объясняется здесь: 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;
    }
}

Ответы [ 2 ]

4 голосов
/ 01 декабря 2008

Это ограничение PHP - родительский класс не может определить имя подкласса, для которого статически вызываются его методы.

PHP 5.3 теперь поддерживает поздние статические привязки, что позволит вам делать то, что вам нужно, но пройдет некоторое время, прежде чем это станет широко доступным. См. Некоторую информацию здесь

Здесь есть несколько похожих вопросов, которые, возможно, стоит прочитать для возможных обходных путей, например этот

1 голос
/ 01 декабря 2008

Статический метод связан с его определяющим типом, а не с экземпляром. Дочерние классы не наследуют статические методы (это не имеет смысла). Они все еще привязаны к родительскому типу. Таким образом, метод GET, который связан с родительским типом, не сможет определить, какой тип подтипа вы просто хотите получить. Боюсь, что каждый дочерний класс просто должен будет реализовать свой собственный метод GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...