Одиночка (Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса.
Применение — когда необходим только один экземпляр класса, с возможностью доступа к нему из любой точки приложения.
Примеры использования:
- Запись сообщений в лог-файл
- Доступ к базе данных
В случае когда Одиночка используется для организации доступа к базе данных, могут возникнуть проблемы, когда будет необходимо работать с несколькими серверами баз данных.
Примеры реализации PHP5:
class Singleton { private static $instance = null; // Защищаем от создания второго экземпляра private function __construct() {} private function __clone() {} private function __wakeup() {} // Инициализация объекта или возвращение ранее созданного public static function getInstance() { if (is_null(self::$instance)) { self::$instance = new self(); } return self::$instance; } public function doAction() { } } // Использование Singleton::getInstance()->doAction();
Примеры реализации PHP5.4 и выше с помощью Traits:
trait Singleton { private static $instance = null; // Защищаем от создания второго экземпляра private function __construct() {} private function __clone() {} private function __wakeup() {} // Инициализация объекта или возвращение ранее созданного public static function getInstance() { if (is_null(self::$instance)) { self::$instance = new self(); } return self::$instance; } } class Foo { use Singleton; private $bar = 0; public function incBar() { $this->bar++; } public function getBar() { return $this->bar; } } // Применение $foo = Foo::getInstance(); $foo->incBar(); var_dump($foo->getBar()); $foo = Foo::getInstance(); $foo->incBar(); var_dump($foo->getBar());
Основой реализации Singleton является статическая переменная, значение которой остается неизменным при исполнении за ее приделами. Это позволяет сохранить объект оригинальным между вызовами статического метода getInstance(), и возвращать ссылку на него при каждом последующем вызове метода.
Так же стоит обратить внимание, что конструктор, как правило, приватный. Это обеспечивает использование всегда только одного объекта Одиночки.