2010-05-07 3 views
4

Я работаю над простым абстрактным классом базы данных. В моем использовании этого класса я хочу, чтобы какой-то экземпляр был синглом. Я думал о том, чтобы иметь абстрактный класс, который не a singleton, а затем распространить его на другой абстрактный класс, который является a singleton. Это возможно? Рекомендуемые?абстрактный класс расширяет абстрактный класс в php?

Редактировать: Я хочу иметь два абстрактных, которые практически идентичны, за исключением одного синглтона. Таким образом, единственное различие будет состоять в том, что каждый будет иметь все функции другого, но будет иметь другие свойства и методы, которые заставляют его вести себя как одиночный.

Я хотел бы иметь одну базовую базу кода кода для этого, так как я вношу изменения, мне не нужно синхронизировать два файла.

ответ

3

То, что я делаю, считаю, что абстрактного синглтона нет смысла. Это связано с тем, что

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

2) Добавление метода singleton легко и может быть записано в 8 строках. Смотри ниже.

protected static $_instance; 
public static function getInstance() 
{ 
    if (!isset(self::$_instance)) { 
     self::$_instance = new self(); 
    } 
    self::$_instance; 
} 

3) PHP 5.3 ниже версия не поддерживает позднюю статическую привязку. Это приведет к созданию экземпляра абстрактного класса вместо окончательного класса, наследующего его, и не будет функционировать должным образом, как уже упоминалось Гордоном и Нуккой. Таким образом, для обратной совместимости лучше избегайте этого.

1

Реализация одноплодного шаблона должна удовлетворять двум требования:

  1. Он должен обеспечить механизм для доступа к экземпляру класса синглтона, не создавая объект класса
  2. Он должен сохраняться одноплодным объектом так, чтобы он не созданных экземплярами более одного раза

Пока это предусмотрено, варианты несколько. Нет ничего плохого в том, чтобы сделать абстракцию класса от другого абстрактного, если это то, что вам нужно. НО, как говорит @Gordon, имейте в виду, что переопределение статических методов/свойств вызывает своеобразное поведение в PHP < 5.3.