Абстрактный шаблон синглтон - PullRequest
1 голос
/ 21 января 2012

Я пытаюсь достичь следующей цели:

Использование этого общего синглтон-класса:

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.

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

1 Ответ

5 голосов
/ 21 января 2012

Сокращенный код из моих слайдов Синглеты в PHP - почему они плохие и как вы можете устранить их из своих приложений :

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 в расширяющем классе.

Также см. Существует ли сценарий использования для синглетонов с доступом к базе данных в PHP?

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