mdevelop

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

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

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


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

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

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

danforth:
Невижу никаких сложностей

Или я вас не понял или вы меня.

Я имел ввиду, например, что вместо

$class = new Class();

$class->vars($get); (или class::vars($get))

Можно написать

$class::getInstance()->vars($get);

Но у меня три паттерна, а не один общий. В моем случае это выглядит так:

Data::get()->page($_SERVER['REQUEST_URI']);

Т.е. это как довод в пользу использования Синглтона.

-----

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

С юзерами - один экземпляр класса юзер - это конкретно сейчас залогиненный юзер, а второй экземпляр класса юзер - это экземпляр класса над которым производится действие. Например залогиненный админ банит некоторого юзера.

синглтон для БД нужен всего для ОДНОЙ вещи - что бы подключаться к БД один раз, а не делать 100 подключений из каждого файла.

я не понимаю как можно подключаться 100 раз. Мы же подключаемся в __construct, ссылку на подключение сохраняем в переменной класса (это нужно для mysqli), а дальше уже из методов вызываем, например mysqli_query(self::$dblink, self::parse($query) ).

может имеется ввиду создание экземпляра класса БД в других классах? так мы же используем статику и вызов и из других классов уже происходит без подключения, например, так db::query($q); Статические методы и так доступны из всех классов.


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

Я думаю дело в том, что большинство мануалов по синглтонам бестолковые. Там пишут что то вроде "подключаться к БД один раз, а не делать 100 подключений из каждого файла" и программист думает "ну тогда я и статическим классом обойдусь". Про реальные преимущества синглотнов мало инфы.

Пока для себя нашел два. Это такая конструкция, например, data::get()->settings($param)->tree($param).

Второе преимущество: возможность наследовать классы. Например, если у нас есть расширенная версия класса Login с подключением через социальные сети, допустим, LoginSoc, тогда мы его объединяем с общим классом Login. Наличие статически методов в этом случае создает дополнительные сложности.

Aisamiery, а вы используете синглтоны, если да, то как и где?

danforth:
Несколько методов одной строкой реализуется через возврат $this в методе.

А если нужно передать параметры, например, так: singlton::getInstance()->setvars($_GET, $_POST);