PHP: Стандарты конструкторов классов, предотвращающие реализацию - PullRequest
2 голосов
/ 30 ноября 2010

Просто вопрос о стандартах.

Я создал класс-оболочку для управления сеансами 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; DR: Я продолжаю использовать getInstance() и create() методы для управления всеми объектами.Я делаю это неправильно?


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

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

Синглтоны обычно считаются «плохими»; см. этот раздел здесь о войне пламени на тему.

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

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

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

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

0 голосов
/ 30 ноября 2010

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

0 голосов
/ 30 ноября 2010

getInstance() используется повсеместно в Zend Framework, который является моим стандартом и условностями в коде.

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

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