2012-01-21 2 views
1

Я пытаюсь достичь следующей цели:Аннотация Singleton шаблон класса

Используя этот общий одноэлементный класс:

abstract class Singleton { 

    private static $instance = null; 

    public static function self() 
    { 
     if(self::$instance == null) 
     { 
     $c = __CLASS__; 
     self::$instance = new $c; 
     } 

     return self::$instance; 
    } 
} 

Я хотел бы, чтобы быть в состоянии создать конкретный класс Singleton, такие как:

class Registry extends Singleton { 
    private function __construct() {} 
    ... 
} 

, а затем использовать их в качестве:

Registry::self()->myAwesomePonyRelatedMethod(); 

Но неясно __CLASS__ предназначен как Singleton, поэтому возникает фатальная ошибка, когда PHP не может создать экземпляр абстрактного класса. Но правда в том, что я хочу, чтобы реестр (например) был создан.

Так что я пробовал с get_class($this), но, будучи статическим классом, у Singleton нет $ this.

Что я могу сделать, чтобы это сработало?

+0

Какая версия PHP вы используете? –

+0

@Phoenix 5.3.0+ – Shoe

+4

[Одиночество зла] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) –

ответ

5

Сокращенный код из моих слайдов Singletons in PHP - Why they are bad and how you can eliminate them from your applications:

abstract class Singleton 
{ 
    public static function getInstance() 
    { 
     return isset(static::$instance) 
      ? static::$instance 
      : static::$instance = new static(); 
    } 

    final private function __construct() 
    { 
     static::init(); 
    } 

    final public function __clone() { 
     throw new Exception('Not Allowed'); 
    } 

    final public function __wakeup() { 
     throw new Exception('Not Allowed'); 
    } 

    protected function init() 
    {} 
} 

Затем вы можете сделать

class A extends Singleton 
{ 
    protected static $instance; 
} 

Если вам нужно сделать дополнительные настройки логики переопределения init в расширяющейся классе.

Также см Is there a use-case for singletons with database access in PHP?

+1

+1 Для упоминания слайдов :) – Pelshoff

+2

@Gordon, вы только что разрушили мою идею проекта. Как жестоко! Я любил Синглтон раньше, и теперь я прочитал все эти плохие вещи о них :(Так что, в основном, чтобы избежать их, я должен использовать шаблон инъекции зависимостей? – Shoe

+1

@JeffPigarelli Я бы сказал, извините, если я не буду считать это крупным WIN;) Да. Инъекция зависимостей - это путь. И разделение графиков авторов и графиков соавторов. См. Http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/ – Gordon

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