- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
A007MP,*да, наверное все таки не буду выкладывать на GitHub.
$class::getInstance()
А вдруг это не одиночка, а другой шаблон?
Декоратор, допустим.
Одиночка используется, если необходимо обеспечить наличие одного экземпляра или ленивую инициализацию.
Может также использоваться пул одиночек.
---------- Добавлено 05.02.2017 в 12:40 ----------
1) Проблемы с тестированием.
Как и с любым статическим методом :)
Как эту проблему решают фреймворки? :) У них тоже статики дофига.
2) Непрозрачная структура зависимостей: синглтон не передается параметром в метод, он вызывается изнутри через getInstance();
Можно передавать параметром. :)
Ну и это отновится к любой статике. :)
3) Нарушением S акронима SOLID, управляет своим жизненным циклом сам, невозможно уничтожить (а даже если и сделать метод-деструктор, то появляется зависимость от состояния системы - кто вызвал, когда инстанс был создан, кем, для чего, а может он уже вообще не нужен?).
А зачем его уничтожать? :)
Если это соединение с БД, то можно просто его закрыть. :)
4) Порождает высокую связанность системы, которая полностью опирается на этот синглтон. Можете поискать в проекте с хотя бы синглтоном количество вызовов getInstance();
Хм, одиночку можно реализовать и без статического метода.
Но это будет не совсем одиночка.
Хранить одиночку в поле приложения.
Но необходима гарантия, что существует только один экземпляр приложения.
Хотя, зачем. Если будет другой экземпляр, то ему лучше дать своего одиночку. :)
5) Нету никакой необходимости в его использовании. Нету ни одной причины, где действительно требовалось существование только одного объекта за жизненный цикл программы, и где бы мы не смогли проконтролировать количество этих объектов.
А как контролировать количество соединений с mysql и memcached? :)
---------- Добавлено 05.02.2017 в 12:46 ----------
Из очевидных преимуществ я пока вижу возможность реализовать несколько методов одной строкой, например, так $class::getInstance()->method1()->method2()->method2().
Одиночка тут ни при чем.
Это называется цепочка вызовов.
Реализуется через return $this.
Я переписал сейчас код. Получилось 3 синглтона: база, пользователь, данные (настройки, конфиги, хранилище). Собственно, я и раньше конструкцию синглтона использовал, только не знал, что это синглтон. А необходимость такая у меня возникала при работе статических методов с нестатическими. И как быть с наследованием статических методов?
Или копированием, если тот же класс БД использует две базы.
Одиночка тут ни при чем.
Это называется цепочка вызовов.
Реализуется через return $this.
Да, я уже понял, просто раньше не использовал. Но со статическим классом также нельзя
$class = new Class()->method($param);, т.е. минимум 2 строчки, а с синглтоном одна.
Aisamiery, а вы используете синглтоны, если да, то как и где?
В основном как хранилище конфигураций. Вам синглтон нужен только в одном случае, когда объект данного типа может существовать в приложении только один и никак более, сколько бы не пытались создать экземпляров это всегда должен быть один и тот же экземпляр.
User никак не может быть синглтоном, синглтону хорошо подходит роль диспечера (клиента) БД, интерфейсом к внешним источникам или что то подобное.
я не понимаю как можно подключаться 100 раз. Мы же подключаемся в __construct, ссылку на подключение сохраняем в переменной класса
А сколько раз вы сам класс вызываете? Синглтон просто не дает создавать копии вызываемого класса.
А сколько раз вы сам класс вызываете? Синглтон просто не дает создавать копии вызываемого класса.
Конструктор вызывается только при инициализации класса, то есть 1 раз.
При последующих вызовах он не вызывается, хоть их сотня будет. Единственное, чтобы вызвать этот класс работы с БД из другого класса, нужно передать ему ссылку на него.
Я сделал немного иначе - в конструкторе идет соединение с БД, в деструкторе - разрыв соединения.
Класс инициализируется как = new ClassBD. А вот методы работы с базой сделаны статически. То есть в любом месте и из любого класса можно вызвать статику и она будет работать с текущим подключением.