Статика VS Singleton?

Есть ли какой-то профит в использовании объекта Singleton вместо статических атрибутов и методов?

Singleton:
class One {
    private $var;
    private $instance;

    /** Пропущена защита конструкторов, клонов и wakeup`ов. */

    static public function Instance () {
        if ( is_null( $this->instance ))
            $this->instance = new static;

        return $this->instance;
    }

    public function set ( $var ) {
        $this->var = $var;
    }

    public function get () {
        return $this->var;
    }
}
One::Instance()->set(2);
echo One::Instance()->get();


Статика:
class Two {
    static private $var;

    static public function Set ( $var ) {
        self::$var = $var;
    }

    static public function Get () {
        return self::$var;
    }
}
Two::Set(2);
echo Two::Get();



Я везде использую вариант «Two», но вдруг я что-то важное упускаю?
  • Вопрос задан
  • 5648 просмотров
Решения вопроса 1
@gro
Основное преимущество объектов, полизморфизм, на:
function func($obj) {
$obj->method1();
$obj->medhod2();
}

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

И откуда получен этот объект, через Singleton или нет, много подобных объектов в системе или он один, нам не интересно.
А со вторым способом мы жестко привязались к классу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
Melkij
@Melkij
PostgreSQL DBA
Если вам нужна кучка функций, хоть и под общей эгидой — статика.
Если вам нужен объект — одиночка.

Важная между ними разница — вызов конструктора и деструктора. У синглтона и тот и другой вызываются автоматически.
Тогда как в куче статических методов вам придётся в каждом методе проверять, был ли вызван конструктор для достижения того же эффекта. Да, от этого можно избавиться, реализовав __CallStatic и приняв правила именования методов так, чтобы в чистом виде они никогда не вызывались, но не кажется ли это вам костылём?
Ответ написан
taliban
@taliban
php программист
Не смотря на камент выше, разницы никакой абсолютно (вызов разный). В итоге и там и там появляется лишь один экземпляр сущности с которой Вы работаете, ну и + синглтон в памяти будет занимать еще лишние несколько килобайт как обьект. Главное что работу они выполняют одинаково.
Ответ написан
@jrip
Если вы не чувствуете между ними разницы на практике, то используйте тот способ какой вам удобнее.
На то как оно внутри устроено можно не обращать внимания, обычно существует много более важных мест где следует подумать об оптимизации.
Ответ написан
Комментировать
Ogra
@Ogra
А я вот наоборот, думаю, как бы избавиться от Синглтонов и Статических объектов. Есть мнение, что это — зло, потому что равносильно глобальным данным.
P.S. Просто попался проект, на котором большими красными буквами написано Оверинжиниринг, и там очень много используется Синглтонов — по делу и не по делу.
Ответ написан
etc
@etc
Тоже столкнулся с этим вопросом, когда реализовывал реестр. Пока остановился на статическом массиве и методах, ибо там всего 2 метода и 1 статический массив.
Ответ написан
Комментировать
Смотря как использовать. Даже если забыть про конструктуры/деструкторы и прочий «сахар», то у синглтона есть и другое преимущества — его можно передать в качестве параметра функции/метода, то есть уменьшить связанность кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы