PHP, преимущества синглтона

12
danforth
На сайте с 18.12.2015
Offline
153
#11

A007MP,*да, наверное все таки не буду выкладывать на GitHub.

Junior Web Developer
L
На сайте с 10.02.2015
Offline
222
#12
mdevelop:
$class::getInstance()

А вдруг это не одиночка, а другой шаблон?

Декоратор, допустим.

Одиночка используется, если необходимо обеспечить наличие одного экземпляра или ленивую инициализацию.

Может также использоваться пул одиночек.

---------- Добавлено 05.02.2017 в 12:40 ----------

danforth:

1) Проблемы с тестированием.

Как и с любым статическим методом :)

Как эту проблему решают фреймворки? :) У них тоже статики дофига.

danforth:

2) Непрозрачная структура зависимостей: синглтон не передается параметром в метод, он вызывается изнутри через getInstance();

Можно передавать параметром. :)

Ну и это отновится к любой статике. :)

danforth:

3) Нарушением S акронима SOLID, управляет своим жизненным циклом сам, невозможно уничтожить (а даже если и сделать метод-деструктор, то появляется зависимость от состояния системы - кто вызвал, когда инстанс был создан, кем, для чего, а может он уже вообще не нужен?).

А зачем его уничтожать? :)

Если это соединение с БД, то можно просто его закрыть. :)

danforth:

4) Порождает высокую связанность системы, которая полностью опирается на этот синглтон. Можете поискать в проекте с хотя бы синглтоном количество вызовов getInstance();

Хм, одиночку можно реализовать и без статического метода.

Но это будет не совсем одиночка.

Хранить одиночку в поле приложения.

Но необходима гарантия, что существует только один экземпляр приложения.

Хотя, зачем. Если будет другой экземпляр, то ему лучше дать своего одиночку. :)

danforth:

5) Нету никакой необходимости в его использовании. Нету ни одной причины, где действительно требовалось существование только одного объекта за жизненный цикл программы, и где бы мы не смогли проконтролировать количество этих объектов.

А как контролировать количество соединений с mysql и memcached? :)

---------- Добавлено 05.02.2017 в 12:46 ----------

mdevelop:
Из очевидных преимуществ я пока вижу возможность реализовать несколько методов одной строкой, например, так $class::getInstance()->method1()->method2()->method2().

Одиночка тут ни при чем.

Это называется цепочка вызовов.

Реализуется через return $this.

M
На сайте с 03.02.2017
Offline
0
#13
Одиночка используется, если необходимо обеспечить наличие одного экземпляра или ленивую инициализацию.

Я переписал сейчас код. Получилось 3 синглтона: база, пользователь, данные (настройки, конфиги, хранилище). Собственно, я и раньше конструкцию синглтона использовал, только не знал, что это синглтон. А необходимость такая у меня возникала при работе статических методов с нестатическими. И как быть с наследованием статических методов?

Или копированием, если тот же класс БД использует две базы.


Одиночка тут ни при чем.
Это называется цепочка вызовов.
Реализуется через return $this.

Да, я уже понял, просто раньше не использовал. Но со статическим классом также нельзя

$class = new Class()->method($param);, т.е. минимум 2 строчки, а с синглтоном одна.

Aisamiery
На сайте с 12.04.2015
Offline
293
#14
mdevelop:
Aisamiery, а вы используете синглтоны, если да, то как и где?

В основном как хранилище конфигураций. Вам синглтон нужен только в одном случае, когда объект данного типа может существовать в приложении только один и никак более, сколько бы не пытались создать экземпляров это всегда должен быть один и тот же экземпляр.

User никак не может быть синглтоном, синглтону хорошо подходит роль диспечера (клиента) БД, интерфейсом к внешним источникам или что то подобное.

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
bay_ebook
На сайте с 28.05.2010
Offline
111
#15
mdevelop:
я не понимаю как можно подключаться 100 раз. Мы же подключаемся в __construct, ссылку на подключение сохраняем в переменной класса

А сколько раз вы сам класс вызываете? Синглтон просто не дает создавать копии вызываемого класса.

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
AP
На сайте с 12.06.2015
Offline
75
#16
bay_ebook:
А сколько раз вы сам класс вызываете? Синглтон просто не дает создавать копии вызываемого класса.

Конструктор вызывается только при инициализации класса, то есть 1 раз.

При последующих вызовах он не вызывается, хоть их сотня будет. Единственное, чтобы вызвать этот класс работы с БД из другого класса, нужно передать ему ссылку на него.

Я сделал немного иначе - в конструкторе идет соединение с БД, в деструкторе - разрыв соединения.

Класс инициализируется как = new ClassBD. А вот методы работы с базой сделаны статически. То есть в любом месте и из любого класса можно вызвать статику и она будет работать с текущим подключением.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий