2010-11-30 6 views
1

Просто вопрос о стандартах.PHP: Стандарты конструкторов классов, предотвращающие создание экземпляров

Я создал класс оболочки для управления сеансом PHP, который помогает автоматически организовывать данные сеанса на основе определенных внутренних модулей, доступных для него. Он разработан как одноэлементный, используя метод getInstance() для создания экземпляра, поскольку в данный момент будет только один сеанс. Кроме того, это стало для меня преимуществом, так как я могу предотвратить создание экземпляра объекта сеанса в (хотя возможно ограниченном) шансе, что session_start() терпит неудачу. Например, для примера:

public static function getInstance(){ 
     if(!self::$_instance || !session_id()){ 
      if(session_start()){ 
       self::$_instance = new self(session_id()); 
      }else{ 
       return; 
      } 

     } 
     return self::$_instance; 
    } 

Мой вопрос: хотя использование метода шлюза getInstance() работает естественным образом здесь по нескольким причинам, является ли общепринятой практикой реализовать общедоступные статические методы getInstance() или create() в классах для управления созданием объекта, если объект зависит от внешних условий?

Я просто обнаружил, что придерживаюсь соглашения о предоставлении getInstance() в случае одиночных игр и create() в случае нескольких объектов экземпляра.

TL; Я продолжаю использовать методы getInstance() и create() для управления всеми объектами. Я делаю это неправильно?


EDIT: Доработка мой вопрос немного; Помимо использования getInstance() для синглтонов, мой конструктор обертывает create() методами, служащими менее целенаправленно и более склонными к плохому соглашению? Должен ли я бросать Исключения из истинного конструктора или продолжать возвращать false из create()?

ответ

1

Синглы, как правило, считаются «плохими»; см. this section here для пламенной войны на эту тему.

Тем не менее, используя фабричные методы или заводские классы для создания объектов, как правило, считается хорошим, так что вы хорошо там :)

Лично я использую symfony dependency injection компонент (может быть установлен в любом проекте без использования Symfony рамки), чтобы упростить инъекцию зависимостей и избегать синглтонов, где это представляется уместным.

Я все еще использую некоторые синглтоны, где это имеет смысл для меня; журналы и фабричные объекты, например, кажутся, естественно, единственными для меня, поэтому я делаю их таким образом. Идея состоит в том, что глобальная функциональность (например, фабрика) в порядке, но глобальная состояние плохое, я считаю.

Что касается вашего измененного вопроса о том, следует ли бросать исключение или возвращать false из вашего вызова create(); это зависит от того, сможет ли ваше приложение успешно продолжить работу без созданного объекта, если нет. Если, например, вы создали соединение с базой данных, которое необходимо для создания страницы, а затем выбросите исключение. Если вы делаете что-то менее существенное, верните false и продолжайте свой веселый путь :)

+2

Одиночный шаблон не плох, это точно. Чрезмерное это плохо (как злоупотребление чем-то плохо). :) – egis 2010-11-30 06:25:18

+0

Все в меру, я полагаю :) – 2010-11-30 06:28:37

+0

Thanks ** El Yobo **; Я посмотрю ваше предложение :) – Dan 2010-11-30 06:50:57

0

getInstance() используется ВСЕ по месту в Zend Framework, что является моим соглашением о стандартах и ​​соглашениях в коде.

как для создания(), а как насчет использования метода магии __construct, так что когда вы делаете new Blah(), он вызывает метод __construct для этого класса?

0

Вы должны использовать метод __construct, используя метод create. Как вызывается __construct, вы можете выполнить инициализацию и другие функции в конструкторе. Еще одно преимущество заключается в том, что вы можете забыть вызвать метод create(), и ваш объект может находиться в противоречивом состоянии

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