2008-11-30 3 views
3

Синглтон поясняется здесь: http://en.wikipedia.org/wiki/Singleton_pattern#PHP_5. Я хочу использовать класс singleton как суперкласс и расширять его в других классах, которые должны быть одноточечными. Проблема в том, что суперкласс делает экземпляр сам по себе, а не подкласс. Любая идея, как я могу заставить Суперкласс создать экземпляр подкласса?Синглтонское наследие

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

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

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

Есть несколько подобных вопросов на здесь, которые могут быть стоит прочитать возможные обходные пути, например this one

1

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

+0

На самом деле, есть хак называется «позднего статического связывания», который идет в 5.3, но не означает, что это хорошая идея использовать его. – troelskn 2008-11-30 22:28:04

Смежные вопросы